Official: Chanter.lua

Skaa
Posts: 27
Joined: Sun Apr 02, 2017 6:24 am
Has thanked: 1 time
Been thanked: 3 times

Re: Official: Chanter.lua

Post by Skaa » Sat May 13, 2017 11:38 pm

-- Heal 4: Healing Light
if EntityState:GetState( Helper:CheckName( "Recovery Spell" )) == nil and Helper:CheckAvailable( "1840" ) and (( IsPriority and Entity:GetHealth() < 50 ) or ( not IsPriority and Entity:GetHealth() < 60 )) then
Helper:CheckExecute( "1840", Entity );
return false;
end

amad
Posts: 26
Joined: Wed Mar 08, 2017 3:09 pm
Has thanked: 6 times

Re: Official: Chanter.lua

Post by amad » Mon Jun 26, 2017 8:01 am

Hello anyone can help me? I'm using this lua for EU but i have this error "- [string "Chanter.lua"]:302: attempt to index field 'Chanter' (a nil value)"

Code: Select all

--[[

	--------------------------------------------------
	Copyright (C) 2011 Blastradius

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
	--------------------------------------------------

]]--

--- (Private Function) Checks the healing requirements for the provided entity.
--
-- @param	Entity	Contains the entity to perform healing on.
-- @param	double	Contains the
-- @return	bool

function _CheckHeal( Entity )

-- Retrieve the rechargeable health.
	local HealthRecharge = Entity:GetHealthMaximum() - Entity:GetHealthCurrent();
	
	-- Retrieve the state.
	local EntityState = Entity:GetState();
	

	-- Heal 1: Stamina Recovery
	if Entity:GetID() == Player:GetID() and Helper:CheckAvailable( "Stamina Restoration" ) and HealthRecharge > 4000 then
		Helper:CheckExecute( "Stamina Restoration" );
	return false;
	end
	
	-- Heal 2: Recovery Magic
	if Helper:CheckAvailable( "Recovery Magic" ) and Entity:GetHealth() < 70 then
		Helper:CheckExecute( "Recovery Magic" );
	return false;
	end
	
	-- Heal 3: Healing Light
	if Helper:CheckAvailable( 1850 ) and Entity:GetHealth() < 60 and EntityState:GetState( "Recovery Magic" ) == nil then
		Helper:CheckExecute( 1850 )
	return false;
	end
	
	--[[ Heal 3: Healing Burst
	if Helper:CheckAvailable( "Healing Burst" ) and Entity:GetHealth() < 50 then
		Helper:CheckExecute( "Healing Burst", Entity );
	return false;
	end]]

end

--- Perform the attack routine on the selected target.
--
-- @param	Entity	Contains the entity we have targeted.
-- @param	double	Contains the distance to the target
-- @param	bool	Indicates whether or not the target is stunned.
-- @return	bool

function Attack( Entity, Range, Stunned )

	-- Indicates whether or not attacks are allowed for a Cleric. Extra toggle to allow features such as follow-mode support.
	if Settings.Chanter.AllowAttack then

		-- Prepare the attack timer when the target is stunned to determine when to use Soul Crush.
		if Stunned and self.AttackTimer == nil then
			self.AttackTimer = Time() + 750;
		elseif not Stunned then
			self.AttackTimer = nil;
		end
		
		if Helper:CheckAvailable( "Stamina Restoration" ) and Player:GetManaCurrent() < Player:GetManaMaximum() - 4000 then
			Helper:CheckExecute( "Stamina Restoration" );
			return false;			
		end
		
		--------------------------------------------------
		--         C H A I N   A T T A C K (S)          --
		--------------------------------------------------

		-- Chain Attack 1: Remove Shock
		if not Stunned and Helper:CheckAvailable( "Backshock" ) and ( not Helper:CheckAvailable( "Retribution" ) or Range <= 10 ) then
			Helper:CheckExecute( "Backshock" );
			return false;
		elseif not Stunned and Helper:CheckAvailable( "Retribution" ) then
			Helper:CheckExecute( "Retribution" );	
			return false;
		elseif Helper:CheckAvailable( "Remove Shock" ) then
			Helper:CheckExecute( "Remove Shock" );
			return false;
		end

		-- Chain Attack 2: Meteor Strike
		if Helper:CheckAvailable( "Pentacle Shock" ) then
			Helper:CheckExecute( "Pentacle Shock" );
			return false;
		elseif Helper:CheckAvailable( "Incandescent Blow" ) then
			Helper:CheckExecute( "Incandescent Blow" );
			return false;
		end

		-- Chain Attack 4: Hallowed Strike
		if Helper:CheckAvailable( "Hallowed Strike" ) then
			Helper:CheckExecute( "Hallowed Strike" );	
			return false;
		elseif Helper:CheckAvailable( "Booming Strike" ) then
			Helper:CheckExecute( "Booming Strike" );
			return false;
		elseif Helper:CheckAvailable( "Split Strike" ) then
			Helper:CheckExecute( "Split Strike" );
			return false;
		elseif Helper:CheckAvailable( "Vehemence Strike" ) then
			Helper:CheckExecute( "Vehemence Strike" );		
			return false;
		end

		-- Chain Attack 3: Infernal Blaze (Parrying Strike, if available, is preferred).
		if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) and Helper:CheckAvailable( "Infernal Blaze" ) then
			Helper:CheckExecute( "Parrying Strike" );
			return false;
		elseif not Stunned and Helper:CheckAvailable( "Infernal Blaze" ) then
			Helper:CheckExecute( "Infernal Blaze" );
			return false;
		end

	    -- Chain Attack 3.1: Infernal Blaze (Parrying Strike, if available, is preferred).
	    if not Stunned and Helper:CheckAvailable( "Splash Swing" ) and Helper:CheckAvailable( "Infernal Blaze" ) then
			Helper:CheckExecute( "Splash Swing" );
			return false;
		elseif not Stunned and Helper:CheckAvailable( "Infernal Blaze" ) then
			Helper:CheckExecute( "Infernal Blaze" );
			return false;
		end
        
		-- Chain Attack 5: Blast
		if Helper:CheckAvailable( "Blast" ) then
			Helper:CheckExecute( "Blast" );
			return false;
		end

	--------------------------------------------------
	--       R E A C T I V E   A T T A C K (S)      --
	--------------------------------------------------


	--------------------------------------------------
	--   C O N D I T I O N A L   A T T A C K (S)    --
	--------------------------------------------------

	-- Conditional Attack 1: Seismic Crash
	if Helper:CheckAvailable( "Seismic Crash" ) then
		Helper:CheckExecute( "Seismic Crash" );
		return false;
	end

	-- Conditional Attack 2: Resonance Haze
	if Helper:CheckAvailable( "Resonance Haze" ) then
		Helper:CheckExecute( "Resonance Haze" );
		return false;
	end
	
	-- Conditional Attack 2.5: Resonance Attack
	if Helper:CheckAvailable( "Resonance Attack" ) then
		Helper:CheckExecute( "Resonance Attack" );
		return false;	
	end

	-- Conditional Attack 3: Soul Lock
	if Helper:CheckAvailable( "Soul Lock" ) then
		Helper:CheckExecute( "Soul Lock" );		
		return false;
	end

	-- Conditional Attack 4: Parrying Strike
	if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) then
		Helper:CheckExecute( "Parrying Strike" );
		return false;
	end

	-- Conditional Attack 5: Parrying Strike
	if not Stunned and Helper:CheckAvailable( "Splash Swing" ) then
		Helper:CheckExecute( "Splash Swing" );
		return false;	
	end

	-- Conditional Attack 6: Soul Crush
	if self.AttackTimer ~= nil and self.AttackTimer < Time() and Helper:CheckAvailable( "Soul Crush" ) then
		Helper:CheckExecute( "Soul Crush" );
		return false;	
	end

	--------------------------------------------------
	--     P R E P A R I N G   A T T A C K (S)      --
	--------------------------------------------------

	-- Preparing Attack 1: Word of Wind
	if ( Settings.Chanter.AllowWoWWhenGrinding or Entity:IsPlayer()) and not Entity:IsDead() and Player:GetDP() >= 2000 and Helper:CheckAvailable( "Word of Wind" ) and Player:GetState():GetState( Helper:CheckName( "Word of Wind" )) == nil then
		Helper:CheckExecute( "Word of Wind" );	
	end
	
	-- Preparing Attack 1.1: Divine Protection"
	if ( Settings.Chanter.AllowYustielWhenGrinding or Entity:IsPlayer()) and not Entity:IsDead() and Player:GetDP() >= 2000 and Helper:CheckAvailable( "Winter Circle" ) and Player:GetState():GetState( Helper:CheckName( "Winter Circle" )) == nil then
		Helper:CheckExecute( "Winter Circle" );
	end

	-- When the entity is a player ...
	if Entity:IsPlayer() then

		-- Preparing Attack 2: Safer Ward
		if Helper:CheckAvailable( "Protective Ward" ) then
			Helper:CheckExecute( "Protective Ward" );
			return false;			
		end

		-- Otherwise when the entity is not a player ...
	else

	end

	--------------------------------------------------
	--        R A N G E D   A T T A C K (S)         --
	--------------------------------------------------

	-- Ranged Attack 1: Inescapable Judgement/Soul Strike and Retribution (Chain Skill)
	if not Stunned and Helper:CheckAvailable( "Inescapable Judgment" ) then
		Helper:CheckExecute( "Inescapable Judgment" );	
		return false;	
	end

	--------------------------------------------------
	--        N O R M A L   A T T A C K (S)         --
	--------------------------------------------------

	-- Normal Attack 1: Mountain Crash
	if Helper:CheckAvailable( "Mountain Crash" ) then
		Helper:CheckExecute( "Mountain Crash" );	
		return false;	
	end

	-- Normal Attack 3: Numbing Blow
	if not Stunned and Helper:CheckAvailable( "Numbing Blow" ) then
		Helper:CheckExecute( "Numbing Blow" );
		return false;	
	end

	--------------------------------------------------
	--       I N I T I A L   A T T A C K (S)        --
	--------------------------------------------------

	-- Initial Attack 1: Automatic Attack
	if self.AttackStarted ~= Entity:GetID() then
		self.AttackStarted = Entity:GetID();
		Helper:CheckExecute( "Attack/Chat" );
		return false;		
	end

	-- Initial Attack 2: Meteor Strike
	if Helper:CheckAvailable( "Meteor Strike" ) then
		Helper:CheckExecute( "Meteor Strike" );
		return false;	
	end

	-- Initial Attack 3: Hallowed Strike
	if Helper:CheckAvailable( "Hallowed Strike" ) then
		Helper:CheckExecute( "Hallowed Strike" );
		return false;	
	end

	-- Initial Attack 5: Annihilation
	if Helper:CheckAvailable( "Annihilation" ) then
		Helper:CheckExecute( "Annihilation" );
		return false;	
	end

	-- Nothing was executed, continue with other functions.
	return true;

	end
end

--- Perform healing checks both in and out of combat.
--
-- @param	bool	Indicates whether or not the function is running before force checks.
-- @return	bool

function Heal( BeforeForce )

	if BeforeForce and Settings.Chanter.AllowBuff and ( self.StateBuffTime == nil or self.StateBuffTime < Time()) then

		local EntityState = Player:GetState();

		if EntityState ~= nil then

				-- Check if this entity has the Blessing of Stone state.
				if Helper:CheckAvailable( "Blessing of Stone" ) and EntityState:GetState( "Blessing of Stone" ) == nil then
					Helper:CheckExecute( "Blessing of Stone", Entity );
					return false;	
				end

						-- Check if this entity has the Prayer of Protection state.
						if Helper:CheckAvailable( "Prayer of Protection" ) and EntityState:GetState( "Prayer of Protection" ) == nil and EntityState:GetState( "Blessing of Stone" ) == nil then
							-- Buff 2: Prayer of Protection
							if Helper:CheckAvailable( "Prayer of Protection" )  then
								Helper:CheckExecute( "Prayer of Protection", Player );
								return false;	
							end
						end

			-- Check if this entity has the Promise of Earth state.
			if Helper:CheckAvailable( "Pledge of Earth" ) and EntityState:GetState( "Pledge of Earth" ) == nil then
				Helper:CheckExecute( "Pledge of Earth", Player );
				return false;
			end
			
			-- Buff 3: Blessing of Wind
			if Helper:CheckAvailable( "Blessing of Wind" ) and EntityState:GetState( Helper:CheckName( "Blessing of Wind" )) == nil then
				Helper:CheckExecute( "Blessing of Wind", Player );
				return false;	
			end

			-- Buff 4: Rage Spell
			if Helper:CheckAvailable( "Rage Spell" ) and EntityState:GetState( "Rage Spell" ) == nil then
				Helper:CheckExecute( "Rage Spell", Player );
				return false;
			end
			
			-- Buff 5: Word of Awakening
			if Helper:CheckAvailable( "Word of Awakening" ) and EntityState:GetState( "Word of Awakening" ) == nil then
				Helper:CheckExecute( "Word of Awakening", Player );	
				return false;
			end
		end
	end

	-- Check if we are allowed to execute our healing routines, after checking the force we can check our own HP.
	if not BeforeForce and Settings.Chanter.AllowHealing then

		-- Check the required direct healing for my own character.
		if not self:_CheckHeal( Player ) then
			
		end

	end

	-- Nothing was executed, continue with other functions.
	return true;

end

--- Perform the required force checks.
--
-- @return	void

function Force()

	--[[
	Step #1 - Prioritize the force members/spirits based on the target's target.
	Step #4 - (AllowHealing) Check the required healing of the prioritized force members/spirits.
	Step #5 - (AllowHealing) Check if multiple force members are required to be healed.
	Step #6 - (AllowHealing) Check the required healing of the non-prioritized force members.
	Step #7 - (AllowHealing) Check if the prioritized force members/spirits require healing over time.
	Step #8 - (AllowBuff) Check the positive state of the prioritized force members/spirits.
	Step #9 - (AllowBuff) Check the positive state of the non-prioritized force members.
	]]--

	-- Contains the amount of force members that would benefit from a group heal.
	local GroupCount = 0;

	-- Contains a list of entities that have been targeted by group members.
	local PriorityList = {};

	-- Contains a list of entities that should be checked for required healing.
	local PriorityListHeal = {};

	-- Contains the entity belonging to a possible master to assist.
	local MasterEntity = EntityList:GetEntity( Settings.MasterName );

	-- Step #1 - Prioritize the force members/spirits based on the target's target.
	for ID, Force in DictionaryIterator( ForceList:GetList()) do

		-- Retrieve the entity for the current force member.
		local Entity = EntityList:GetEntity( Force:GetID());

		-- Check if the entity is available and is not dead.
		if Entity ~= nil and not Entity:IsDead() then

			-- Check if the current force member has selected an entity.
			if Entity:GetTargetID() ~= 0 then
				PriorityList[Entity:GetTargetID()] = true;
			end

			-- Check if the current force member would benefit from a group heal.
			if Settings.Chanter.AllowHealing and Player:GetPosition():DistanceToPosition( Entity:GetPosition()) < 25 and ( Entity:GetHealthMaximum() - Entity:GetHealthCurrent()) >= 2300 then
				GroupCount = GroupCount + 1;
			end

		end

	end

	-- Check the states of the master entity and add it to the priority healing list to enable further checks.
	if MasterEntity ~= nil and not MasterEntity:IsDead() then
			PriorityListHeal[MasterEntity:GetID()] = MasterEntity;
	end

	-- Step #2 - Check the states of the prioritized force members/spirits
	for k,v in pairs( PriorityList ) do

		-- Retrieve the entity for the current index.
		local Entity = EntityList:GetEntity( k );

		-- Check if the entity has been found and is not friendly or dead.
		if Entity ~= nil and not Entity:IsFriendly() and not Entity:IsDead() then

			-- Retrieve the entity for the target of the current entity.
			Entity = EntityList:GetEntity( Entity:GetTargetID());

			-- Check if the target entity has been found and is either a group member or a summoned entity that belongs to a group member.
			if Entity ~= nil and not Entity:IsDead() and (( Entity:GetOwnerID() ~= 0 and ForceList:GetForce( Entity:GetOwnerID()) ~= nil ) or ForceList:GetForce( Entity:GetID()) ~= nil ) then

				-- Add the current entity into the healing priority list to handle after checking spirit states.
				if Settings.Chanter.AllowHealing then
					PriorityListHeal[Entity:GetID()] = Entity;
				end

			end

		end

	end


	-- Check if we are allowed to run the healing-orientated routines.
	if Settings.Chanter.AllowHealing then

		-- Retrieve the target entity.
		local TargetEntity = EntityList:GetEntity( Player:GetTargetID());

		-- Step #4 - Check the required healing of the prioritized force members/spirits.
		for k,v in pairs( PriorityListHeal ) do

			-- Check the required direct healing for this force members/spirits.
			if not self:_CheckHeal( v ) then
				
			end

		end

		-- Step #6 - Check the required healing of the non-prioritized force members.
		for ID, Force in DictionaryIterator( ForceList:GetList()) do

			-- Check if the current force member has already been checked through the priorities.
			if PriorityListHeal[Force:GetID()] == nil then

				-- Get the entity from the EntityList.
				local Entity = EntityList:GetEntity( Force:GetID());

				-- Check the required direct healing for this force member.
				if Entity ~= nil and not self:_CheckHeal( Entity ) then
					
				end

			end

		end

		-- Step #7 - Check if the prioritized force members/spirits require healing over time.
		if Settings.Chanter.AllowBuff and ( self.StateBuffTime == nil or self.StateBuffTime < Time()) then

			-- Loop through the prioritized force members/spirits to check the required healing over time spells.
			for k,v in pairs( PriorityListHeal ) do

				-- Retrieve the entity state for this entity.
				local EntityState = v:GetState();

				-- Retrieve the range to this entity to check if the entity is in range to use a heal-over-time ability.
				local Range = Player:GetPosition():DistanceToPosition( v:GetPosition());

				-- Check the validity of the entity state and the range of the entity.
				if EntityState ~= nil and ( Settings.Chanter.AllowApproach or Range < 25 ) then

					-- Check if should give the current entity the Rebirth Spell heal-over-time.
					if v:GetHealth() <= 100 and Helper:CheckAvailable( "Rebirth Spell" ) and EntityState:GetState( Helper:CheckName( "Rebirth Spell" )) == nil then
						Helper:CheckExecute( "Rebirth Spell", v );
						
					end
				end

			end

		end

	end

	-- Check if we are allowed to buff and perform the routine when required.
	if Settings.Chanter.AllowBuff and Settings.Chanter.AllowBuffForce and ( self.StateBuffTime == nil or self.StateBuffTime < Time()) then

		-- Step #8 - Check the positive state of the prioritized force members/spirits.
		for k,v in pairs( PriorityListHeal ) do

			-- Retrieve the entity state for this entity.
			local EntityState = v:GetState();

			-- Retrieve the range to this entity to check if the entity is in range to use a heal-over-time ability.
			local Range = Player:GetPosition():DistanceToPosition( v:GetPosition());

			--[[ Check the validity of the entity state and the range of the entity.
			if EntityState ~= nil and ( Settings.Chanter.AllowApproach or Range < 25 ) then

						-- Check if this entity has the Blessing of Health state.
						if Helper:CheckAvailable( "Blessing of Health I" ) and EntityState:GetState( "Blessing of Health I" ) == nil and EntityState:GetState( "Blessing of Health II" ) == nil then
							Helper:CheckExecute( "Blessing of Health", Entity );
							return false;	
						end

						-- Check if this entity has the Blessing of Rock state.
						if Helper:CheckAvailable( "Blessing of Rock I" ) and EntityState:GetState( "Blessing of Rock I" ) == nil and EntityState:GetState( "Blessing of Stone I" ) == nil then
							-- Buff 2: Blessing of Rock
							if Helper:CheckAvailable( "Blessing of Stone I" ) then
								Helper:CheckExecute( "Blessing of Stone", v );
								return false;
							-- Buff 2: Blessing of Stone
							elseif Helper:CheckAvailable( "Blessing of Rock I" )  then
								Helper:CheckExecute( "Blessing of Rock", v );
								return false;	
							end
						end

			end]]

		end

		-- Step #9 - (AllowBuff) Check the positive state of the non-prioritized force members.
		for ID, Force in DictionaryIterator( ForceList:GetList()) do

			-- Check if the current force member has already been checked through the priorities.
			if PriorityListHeal[Force:GetID()] == nil then

				-- Get the entity from the EntityList.
				local Entity = EntityList:GetEntity( Force:GetID());

				-- Check the vailidity of the retrieved entity.
				if Entity ~= nil and not Entity:IsDead() then

					-- Retrieve the entity state for this entity.
					local EntityState = Entity:GetState();

					-- Retrieve the range to this entity to check if the entity is in range to use a heal-over-time ability.
					local Range = Player:GetPosition():DistanceToPosition( Entity:GetPosition());

					-- Check the validity of the entity state and the range of the entity.
					if EntityState ~= nil and ( Settings.Chanter.AllowApproach or Range < 25 ) then

						-- Check if this entity has the Blessing of Health state.
						if Helper:CheckAvailable( "Blessing of Health I" ) and EntityState:GetState( "Blessing of Health I" ) == nil and EntityState:GetState( "Blessing of Health II" ) == nil then
							Helper:CheckExecute( "Blessing of Health", Entity );
						return false;	
						end

						--[[ Check if this entity has the Blessing of Rock state.
						if Helper:CheckAvailable( "Blessing of Rock I" ) and EntityState:GetState( "Blessing of Rock I" ) == nil and EntityState:GetState( "Blessing of Stone I" ) == nil then
							-- Buff 2: Blessing of Rock
							if Helper:CheckAvailable( "Blessing of Stone I" ) then
								Helper:CheckExecute( "Blessing of Stone", Entity );
								return false;	
							-- Buff 2: Blessing of Stone
							elseif Helper:CheckAvailable( "Blessing of Rock I" )  then
								Helper:CheckExecute( "Blessing of Rock", Entity );
								return false;	
							end
						end]]
					end

				end

				-- Check the required direct healing for this force member.
				if Entity ~= nil and not self:_CheckHeal( Entity ) then
					
				end

			end

		end

		-- Increment the state timer to postpone additional checks.
		self.StateBuffTime = Time() + 2000;

	end

	-- Nothing was executed, continue with other functions.
	return true;

end

--- Perform the required pause checks.
--
-- @return	bool

function Pause()
	
	self:_CheckHeal ( Player ) ;
	-- Nothing was executed, continue with other functions.
	return true;

end

id4192
Posts: 2
Joined: Tue Jun 13, 2017 7:01 pm

Re: Official: Chanter.lua

Post by id4192 » Tue Jun 27, 2017 3:53 am

It is not perfect but it does the job. Uses all the attack skills and combined with the Option of "Auto Chain" it's ok. Uses Running Scroll, Courage Scroll. Uses Stamina Restoration - Recovery Magic - Parry Skills etc etc.

Had it also use food but had some issues so I disable it. If you go at Settings and rename the recovery potion to the EU names will also using potions properly. Have my bots for days without dying.

Please let me know if it is working for you and try fix it together also for other people that might considering bot with chanter.

Have a nice day!

Code: Select all

--[[

	--------------------------------------------------
	Copyright (C) 2011 Blastradius

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
	--------------------------------------------------
	
]]--

--- (Private Function) Check required healing for the entity.
--
-- @param	Entity		Entity to check.
-- @param	IsPriority	Indicates only priority healing to be executed.
-- @return	bool

function _Heal( Entity, IsPriority )
	
	-- Retrieve the rechargeable health.
	local HealthRecharge = Entity:GetHealthMaximum() - Entity:GetHealthMaximum();
	
	-- Retrieve the state.
	local EntityState = Entity:GetState();
	
	-- Heal 1: Recovery Spell
	if Helper:CheckAvailable( "Recovery Magic" ) and (( IsPriority and HealthRecharge >= 2526 ) or ( not IsPriority and Entity:GetHealth() < 60 )) then
		Helper:CheckExecute( "Recovery Magic", Entity );
		return false;
	end

	-- Heal 2: Stamina Recovery
	if Entity:GetID() == Player:GetID() and Helper:CheckAvailable( "Stamina Restoration" ) and (( IsPriority and Entity:GetHealth() < 40 ) or ( not IsPriority and Entity:GetHealth() < 50 )) then
		Helper:CheckExecute( "Stamina Restoration" );
		return false;
	end

	-- Heal 3: Healing Burst
	if Helper:CheckAvailable( "Healing Burst" ) and (( IsPriority and Entity:GetHealth() < 40 ) or ( not IsPriority and Entity:GetHealth() < 50 )) then
		Helper:CheckExecute( "Healing Burst", Entity );
		return false;
	end
	
	-- Heal 4: Healing Light
	if EntityState:GetState( Helper:CheckName( "Recovery Magic" )) == nil and Helper:CheckAvailable( "Healing Light" ) and (( IsPriority and Entity:GetHealth() < 50 ) or ( not IsPriority and Entity:GetHealth() < 60 )) then
		Helper:CheckExecute( "Healing Light", Entity );
		return false;
	end
	
end

--- Perform the attack routine on the selected target.
--
-- @param	Entity	Contains the entity we have targeted.
-- @param	double	Contains the distance to the target
-- @param	bool	Indicates whether or not the target is stunned.
-- @return	bool

function Attack( Entity, Range, Stunned )

	
	-- Checking and using Scrolls & Foods
	-- self:CheckCritFood();
	-- self:CheckAttackFood();
	self:CheckNaturalHeal();
	self:CheckAttackScroll();
	self:CheckRunScroll();
	
	-- Prepare the attack timer when the target is stunned to determine when to use Soul Crush.
	if Stunned and self.AttackTimer == nil then
		self.AttackTimer = Time() + 750;
	elseif not Stunned then
		self.AttackTimer = nil;
	end
	
	--
	-- Binding Word (Physical Charged Attack)
	--
	
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
	
	self:_Heal( Player, true );
	
	--------------------------------------------------
	--         C H A I N   A T T A C K (S)          --
	--------------------------------------------------

	-- Chain Attack 1: Remove Shock
	if not Stunned and Helper:CheckAvailable( "Backshock" ) and ( not Helper:CheckAvailable( "Retribution" ) or Range <= 10 ) then
		Helper:CheckExecute( "Backshock" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Retribution" ) then
		Helper:CheckExecute( "Retribution" );
		return false;
	elseif Helper:CheckAvailable( "Remove Shock" ) then
		Helper:CheckExecute( "Remove Shock" );
		return false;
	end
	
	-- Chain Attack 2: Meteor Strike
	if Helper:CheckAvailable( "Pentacle Shock" ) then
		Helper:CheckExecute( "Pentacle Shock" );
		return false;
	elseif Helper:CheckAvailable( "Incandescent Blow" ) then
		Helper:CheckExecute( "Incandescent Blow" );
		return false;
	end
	
	-- Chain Attack 4 Part I: Hallowed Strike
	if Helper:CheckAvailable( "Booming Smash" ) then
		Helper:CheckExecute( "Booming Smash" );
		return false;
	elseif Helper:CheckAvailable( "Booming Assault" ) then
		Helper:CheckExecute( "Booming Assault" );
		return false;
	end
	
	-- Chain Attack 3: Infernal Blaze (Parrying Strike, if available, is preferred).
	if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) and Helper:CheckAvailable( "Infernal Blaze" ) then
		Helper:CheckExecute( "Parrying Strike" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Infernal Blaze" ) then
		Helper:CheckExecute( "Infernal Blaze" );
		return false;
	end
	
	-- Chain Attack 4 Part II: Hallowed Strike
	if Helper:CheckAvailable( "Booming Strike" ) then
		Helper:CheckExecute( "Booming Strike" );
		return false;
	end
	
	--------------------------------------------------
	--   C O N D I T I O N A L   A T T A C K (S)    --
	--------------------------------------------------
		
	-- Conditional Attack 1: Seismic Crash
	if Helper:CheckAvailable( "Seismic Crash" ) then
		Helper:CheckExecute( "Seismic Crash" );
		return false;
	end
	
	-- Conditional Attack 2: Resonance Haze
	if Helper:CheckAvailable( "Resonance Haze" ) then
		Helper:CheckExecute( "Resonance Haze" );
		return false;
	end
	
	-- Conditional Attack 3: Soul Lock
	if Helper:CheckAvailable( "Soul Lock" ) then
		Helper:CheckExecute( "Soul Lock" );
		return false;
	end	
	
	-- Conditional Attack 4: Parrying Strike
	if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) then
		Helper:CheckExecute( "Parrying Strike" );
		return false;
	end
	
	-- Conditional Attack 5: Soul Crush
	if self.AttackTimer ~= nil and self.AttackTimer < Time() and Helper:CheckAvailable( "Soul Crush" ) then
		Helper:CheckExecute( "Soul Crush" );
		return false;
	end
	
	--------------------------------------------------
	--     P R E P A R I N G   A T T A C K (S)      --
	--------------------------------------------------
	
	-- When the entity is a player ...
	if Entity:IsPlayer() then
	
		-- Preparing Attack 1: Confident Defense
		if Helper:CheckAvailable( "Confident Defense" ) then
			Helper:CheckExecute( "Confident Defense" );
			return false;
		end	
	
		-- Preparing Attack 2: Protective Ward
		if Helper:CheckAvailable( "Protective Ward" ) then
			Helper:CheckExecute( "Protective Ward" );
			return false;
		end
		
		-- Preparing Attack 3: Marchutan's Protection/Yustiel's Protection
		if Player:GetDP() >= 2000 then
			if Helper:CheckAvailable( "Marchutan's Protection" ) then
				Helper:CheckExecute( "Marchutan's Protection" );
				return false;
			elseif Helper:CheckAvailable( "Yustiel's Protection" ) then
				Helper:CheckExecute( "Yustiel's Protection" );
				return false;
			end
		end
		
	-- Otherwise when the entity is not a player ...
	else

		-- Preparing Attack 4: Focused Parry
		if Helper:CheckAvailable( "Perfect Parry" ) then
			Helper:CheckExecute( "Perfect Parry" );
			return false;
		end	
		
		-- Preparing Attack 4: Word of Revival (Also in Pause)
		if Player:GetHealthCurrent() < Player:GetHealthMaximum() and Player:GetState():GetState( Helper:CheckName( "Rebirth Spell" )) == nil and Helper:CheckAvailable( "Rebirth Spell" ) then
			Helper:CheckExecute( "Rebirth Spell", Player );
			return false;
		end
		
	end
	
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
	
	self:_Heal( Player, true );
	
	--------------------------------------------------
	--        R A N G E D   A T T A C K (S)         --
	--------------------------------------------------
	
	-- Ranged Attack 1: Inescapable Judgement/Soul Strike and Retribution (Chain Skill)
	if not Stunned and Helper:CheckAvailable( "Inescapable Judgement" ) then
		Helper:CheckExecute( "Inescapable Judgement" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Soul Strike" ) then
		Helper:CheckExecute( "Soul Strike" );
		return false;
	end
	
	--------------------------------------------------
	--        N O R M A L   A T T A C K (S)         --
	--------------------------------------------------
	
	-- Normal Attack 1: Mountain Crash
	if Helper:CheckAvailable( "Mountain Crash" ) then
		Helper:CheckExecute( "Mountain Crash" );
		return false;
	end
	
	-- Normal Attack 2: Inescapable Judgment
	if Helper:CheckAvailable( "Inescapable Judgment" ) then
		Helper:CheckExecute( "Inescapable Judgment" );
		return false;
	end
	
		-- Normal Attack 3: Annihilation
	if Helper:CheckAvailable( "Annihilation" ) then
		Helper:CheckExecute( "Annihilation" );
		return false;
	end
	
	-- Normal Attack 4: Disorienting Blow
	if not Stunned and Helper:CheckAvailable( "Disorientating Blow" ) then
		Helper:CheckExecute( "Disorientating Blow" );
		return false;
	end
	
	-- Normal Attack 5: Numbing Blow 
	if not Stunned and Helper:CheckAvailable( "Numbing Blow" ) then
		Helper:CheckExecute( "Numbing Blow" );
		return false;
	end

	--------------------------------------------------
	--       I N I T I A L   A T T A C K (S)        --
	--------------------------------------------------
	
	-- Initial Attack 1: Automatic Attack
	if self.AttackStarted ~= Entity:GetID() then
		self.AttackStarted = Entity:GetID();
		Helper:CheckExecute( "Attack/Chat" );
		return false;
	end
	
	-- Initial Attack 2: Meteor Strike
	if Helper:CheckAvailable( "Meteor Strike" ) then
		Helper:CheckExecute( "Meteor Strike" );
		return false;
	end

	-- Initial Attack 3: Hallowed Strike
	if Helper:CheckAvailable( "Hallowed Strike" ) then
		Helper:CheckExecute( "Hallowed Strike" );
		return false;
	end
		
	-- Nothing was executed, continue with other functions.
	return true;

end

--- Perform healing checks both in and our of combat.
--
-- @param	bool	Indicates whether or not the function is running before force checks.
-- @return	bool

function Heal( BeforeForce )
	
	-- Nothing was executed, continue with other functions.
	return true;
	
end

--- Perform the safety checks before moving to the next target.
--
-- @return	bool

function Pause()
		
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
		
	-- Heal 5: Word of Revival (Also in Attack)
	if Player:GetHealthCurrent() < Player:GetHealthMaximum() and Player:GetState():GetState( Helper:CheckName( "Rebirth Spell" )) == nil and Helper:CheckAvailable( "Word of Revival" ) then
		Helper:CheckExecute( "Rebirth Spell", Player );
		return false;
	end
	
	-- Heal 6: Magic Recovery
	if Helper:CheckAvailable( "Stamina Restoration" ) and Player:GetManaCurrent() < Player:GetManaMaximum() - 2500 then
		Helper:CheckExecute( "Stamina Restoration", Player );
		return false;
	end
	
	-- Heal 0: Non-Priority Healing
	self:_Heal( Player, false );
	
	--------------------------------------------------
	--                B U F F I N G                 --
	--------------------------------------------------

	-- Check if the state checking timer has expired.
	if ( self.StateBuffTime == nil or self.StateBuffTime < Time()) then

		-- Retrieve the state.
		local EntityState = Player:GetState();
		
		-- Buff 0: Blessing of Health
		if Helper:CheckAvailable( "Word of Awakening" ) and EntityState:GetState( "Word of Awakening" ) == nil and EntityState:GetState( "Word of Awakening" ) == nil then
			Helper:CheckExecute( "Word of Awakening", Player );
			return false;
		end
		
		-- Buff 1: Blessing of Health
		if Helper:CheckAvailable( "Blessing of Health" ) and EntityState:GetState( "Blessing of Health" ) == nil and EntityState:GetState( "Blessing of Health" ) == nil then
			Helper:CheckExecute( "Blessing of Health", Player );
			return false;
		end
		
		-- Buff 2: Blessing of Rock/Blessing of Stone
		if EntityState:GetState( "Blessing of Rock" ) == nil and EntityState:GetState( "Blessing of Stone" ) == nil then
		
			-- Buff 2: Blessing of Rock
			if Helper:CheckAvailable( "Blessing of Stone" ) then
				Helper:CheckExecute( "Blessing of Stone", Player );
				return false;
			-- Buff 2: Blessing of Stone
			elseif Helper:CheckAvailable( "Blessing of Rock" )  then
				Helper:CheckExecute( "Blessing of Rock", Player );
				return false;
			end

		end

		-- Buff 3: Promise of Earth
		if Helper:CheckAvailable( "Promise of Earth" ) and EntityState:GetState( Helper:CheckName( "Promise of Earth" )) == nil  then
			Helper:CheckExecute( "Promise of Earth", Player );
			return false;
		end

		-- Buff 3: Rage Spell
		if Helper:CheckAvailable( "Rage Spell" ) and EntityState:GetState( "Rage Spell" ) == nil then
			Helper:CheckExecute( "Rage Spell", Player );
			return false;
		end
		
		-- Update the state checking timer.
		self.StateBuffTime = Time() + 1000;
		
	end
		
	-- Nothing was executed, continue with other functions.
	return true;
	
end
---------------Buff Scrolls-------------
function CheckCritFood()

stateID = {10224,10225,9976,9989,10051,10064};
foodName = {"Calydon Meat Dumpling","Wild Ginseng Pickle","Tasty Calydon Meat Dumpling","Tasty Wild Ginseng Pickle","Innesi Herb Dumpling","Poma Wine Herb Dumpling","Tasty Innesi Herb Dumpling","Tasty Poma Wine Herb Dumpling"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end


return true;
end

--------------------------------
function CheckAttackFood()

stateID = {10051,10064,10224,10225,9976,9989};
foodName = {"Nutritious Abex Cheese Soup","Minor Focus Agent","Lesser Focus Agent","Focus Agent","Greater Focus Agent","Major Focus Agent","Fine Focus Agent"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;


end
-----------------------------------
function CheckNaturalHeal()

stateID = {10044,10094};
foodName = {"Minor Rally Serum","Lesser Rally Serum","Rally Serum","Greater Rally Serum","Major Rally Serum","Fine Rally Serum","Tasty Ormea Cocktail"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
-------------------------------------
function CheckAttackScroll()

stateID = {9959};
foodName = {"Courage Scroll"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
--------------------------
function CheckRunScroll()

stateID = {9960};
foodName = {"Running Scroll"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
EDIT: The code is not mine. I changed all the skill names to EU version and added part of already shared codes for this forum to my Chanter.lua! Credits to vivi for sharing the Chanter.lua from viewtopic.php?f=17&t=12 that helped me have my scrolls working and some tweaks at skills etc.

amad
Posts: 26
Joined: Wed Mar 08, 2017 3:09 pm
Has thanked: 6 times

Re: Official: Chanter.lua

Post by amad » Wed Jun 28, 2017 12:45 pm

Ty @id4192.I tried to add some skills (promise of wind-wow and divine protection) but for some reason aren't work even if i used the same code of my lua bard.Then i changed blessing of rock with prayer of protection.

Code: Select all

--[[

	--------------------------------------------------
	Copyright (C) 2011 Blastradius

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
	--------------------------------------------------
	
]]--

--- (Private Function) Check required healing for the entity.
--
-- @param	Entity		Entity to check.
-- @param	IsPriority	Indicates only priority healing to be executed.
-- @return	bool

function _Heal( Entity, IsPriority )
	
	-- Retrieve the rechargeable health.
	local HealthRecharge = Entity:GetHealthMaximum() - Entity:GetHealthMaximum();
	
	-- Retrieve the state.
	local EntityState = Entity:GetState();
	
	-- Heal 1: Recovery Spell
	if Helper:CheckAvailable( "Recovery Magic" ) and (( IsPriority and HealthRecharge >= 2526 ) or ( not IsPriority and Entity:GetHealth() < 60 )) then
		Helper:CheckExecute( "Recovery Magic", Entity );
		return false;
	end

	-- Heal 2: Stamina Recovery
	if Entity:GetID() == Player:GetID() and Helper:CheckAvailable( "Stamina Restoration" ) and (( IsPriority and Entity:GetHealth() < 40 ) or ( not IsPriority and Entity:GetHealth() < 50 )) then
		Helper:CheckExecute( "Stamina Restoration" );
		return false;
	end

	-- Heal 3: Healing Burst
	if Helper:CheckAvailable( "Healing Burst" ) and (( IsPriority and Entity:GetHealth() < 40 ) or ( not IsPriority and Entity:GetHealth() < 50 )) then
		Helper:CheckExecute( "Healing Burst", Entity );
		return false;
	end
	
	-- Heal 4: Healing Light
	if EntityState:GetState( Helper:CheckName( "Recovery Magic" )) == nil and Helper:CheckAvailable( "Healing Light" ) and (( IsPriority and Entity:GetHealth() < 50 ) or ( not IsPriority and Entity:GetHealth() < 60 )) then
		Helper:CheckExecute( "Healing Light", Entity );
		return false;
	end
	
end

--- Perform the attack routine on the selected target.
--
-- @param	Entity	Contains the entity we have targeted.
-- @param	double	Contains the distance to the target
-- @param	bool	Indicates whether or not the target is stunned.
-- @return	bool

function Attack( Entity, Range, Stunned )

	
	-- Checking and using Scrolls & Foods
	-- self:CheckCritFood();
	-- self:CheckAttackFood();
	self:CheckNaturalHeal();
	self:CheckAttackScroll();
	self:CheckRunScroll();
	
	-- Prepare the attack timer when the target is stunned to determine when to use Soul Crush.
	if Stunned and self.AttackTimer == nil then
		self.AttackTimer = Time() + 750;
	elseif not Stunned then
		self.AttackTimer = nil;
	end
	
	--
	-- Binding Word (Physical Charged Attack)
	--
	
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
	
	self:_Heal( Player, true );
	
	--------------------------------------------------
	--         C H A I N   A T T A C K (S)          --
	--------------------------------------------------

	-- Chain Attack 1: Remove Shock
	if not Stunned and Helper:CheckAvailable( "Backshock" ) and ( not Helper:CheckAvailable( "Retribution" ) or Range <= 10 ) then
		Helper:CheckExecute( "Backshock" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Retribution" ) then
		Helper:CheckExecute( "Retribution" );
		return false;
	elseif Helper:CheckAvailable( "Remove Shock" ) then
		Helper:CheckExecute( "Remove Shock" );
		return false;
	end
	
	-- Chain Attack 2: Meteor Strike
	if Helper:CheckAvailable( "Pentacle Shock" ) then
		Helper:CheckExecute( "Pentacle Shock" );
		return false;
	elseif Helper:CheckAvailable( "Incandescent Blow" ) then
		Helper:CheckExecute( "Incandescent Blow" );
		return false;
	end
	
	-- Chain Attack 4 Part I: Hallowed Strike
	if Helper:CheckAvailable( "Booming Smash" ) then
		Helper:CheckExecute( "Booming Smash" );
		return false;
	elseif Helper:CheckAvailable( "Booming Assault" ) then
		Helper:CheckExecute( "Booming Assault" );
		return false;
	end
	
	-- Chain Attack 3: Infernal Blaze (Parrying Strike, if available, is preferred).
	if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) and Helper:CheckAvailable( "Infernal Blaze" ) then
		Helper:CheckExecute( "Parrying Strike" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Infernal Blaze" ) then
		Helper:CheckExecute( "Infernal Blaze" );
		return false;
	end
	
	-- Chain Attack 4 Part II: Hallowed Strike
	if Helper:CheckAvailable( "Booming Strike" ) then
		Helper:CheckExecute( "Booming Strike" );
		return false;
	end
	
	--------------------------------------------------
	--   C O N D I T I O N A L   A T T A C K (S)    --
	--------------------------------------------------
		
	-- Conditional Attack 1: Seismic Crash
	if Helper:CheckAvailable( "Seismic Crash" ) then
		Helper:CheckExecute( "Seismic Crash" );
		return false;
	end
	
	-- Conditional Attack 2: Resonance Haze
	if Helper:CheckAvailable( "Resonance Haze" ) then
		Helper:CheckExecute( "Resonance Haze" );
		return false;
	end
	
	-- Conditional Attack 3: Soul Lock
	if Helper:CheckAvailable( "Soul Lock" ) then
		Helper:CheckExecute( "Soul Lock" );
		return false;
	end	
	
	-- Conditional Attack 4: Parrying Strike
	if not Stunned and Helper:CheckAvailable( "Parrying Strike" ) then
		Helper:CheckExecute( "Parrying Strike" );
		return false;
	end
	
	-- Conditional Attack 5: Soul Crush
	if self.AttackTimer ~= nil and self.AttackTimer < Time() and Helper:CheckAvailable( "Soul Crush" ) then
		Helper:CheckExecute( "Soul Crush" );
		return false;
	end
	
	--------------------------------------------------
	--     P R E P A R I N G   A T T A C K (S)      --
	--------------------------------------------------
	
	-- When the entity is a player ...
	if Entity:IsPlayer() then
	
		-- Preparing Attack 1: Blessing of Wind
	if Helper:CheckAvailable( "Blessing of Wind" ) and EntityState:GetState( Helper:CheckName( "Blessing of Wind" )) == nil then
			Helper:CheckExecute( "Blessing of Wind", Player );
			return false;
		end	
	
		-- Preparing Attack 2: Protective Ward
		if Helper:CheckAvailable( "Protective Ward" ) then
			Helper:CheckExecute( "Protective Ward" );
			return false;
		end
		
		-- 2000DP Skill Divine Protection , Divine Protection
	if Helper:CheckAvailable( "Divine Protection" ) and Player:GetDP() >=2000 then
		Helper:CheckExecute( "Divine Protection");
		return false;
	end
-- 2000DP Skill Word of Wind , Word of Wind
	if Helper:CheckAvailable( "Word of Wind" ) and Player:GetDP() >=2000 then
		Helper:CheckExecute( "Word of Wind");
		return false;
	end
		
	-- Otherwise when the entity is not a player ...
	else

		-- Preparing Attack 4: Focused Parry
		if Helper:CheckAvailable( "Perfect Parry" ) then
			Helper:CheckExecute( "Perfect Parry" );
			return false;
		end	
		
		-- Preparing Attack 4: Word of Revival (Also in Pause)
		if Player:GetHealthCurrent() < Player:GetHealthMaximum() and Player:GetState():GetState( Helper:CheckName( "Rebirth Spell" )) == nil and Helper:CheckAvailable( "Rebirth Spell" ) then
			Helper:CheckExecute( "Rebirth Spell", Player );
			return false;
		end
		
	end
	
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
	
	self:_Heal( Player, true );
	
	--------------------------------------------------
	--        R A N G E D   A T T A C K (S)         --
	--------------------------------------------------
	
	-- Ranged Attack 1: Inescapable Judgement/Soul Strike and Retribution (Chain Skill)
	if not Stunned and Helper:CheckAvailable( "Inescapable Judgement" ) then
		Helper:CheckExecute( "Inescapable Judgement" );
		return false;
	elseif not Stunned and Helper:CheckAvailable( "Soul Strike" ) then
		Helper:CheckExecute( "Soul Strike" );
		return false;
	end
	
	--------------------------------------------------
	--        N O R M A L   A T T A C K (S)         --
	--------------------------------------------------
	
	-- Normal Attack 1: Mountain Crash
	if Helper:CheckAvailable( "Mountain Crash" ) then
		Helper:CheckExecute( "Mountain Crash" );
		return false;
	end
	
	-- Normal Attack 2: Inescapable Judgment
	if Helper:CheckAvailable( "Inescapable Judgment" ) then
		Helper:CheckExecute( "Inescapable Judgment" );
		return false;
	end
	
		-- Normal Attack 3: Annihilation
	if Helper:CheckAvailable( "Annihilation" ) then
		Helper:CheckExecute( "Annihilation" );
		return false;
	end
	
	-- Normal Attack 4: Disorienting Blow
	if not Stunned and Helper:CheckAvailable( "Disorientating Blow" ) then
		Helper:CheckExecute( "Disorientating Blow" );
		return false;
	end
	
	-- Normal Attack 5: Numbing Blow 
	if not Stunned and Helper:CheckAvailable( "Numbing Blow" ) then
		Helper:CheckExecute( "Numbing Blow" );
		return false;
	end

	--------------------------------------------------
	--       I N I T I A L   A T T A C K (S)        --
	--------------------------------------------------
	
	-- Initial Attack 1: Automatic Attack
	if self.AttackStarted ~= Entity:GetID() then
		self.AttackStarted = Entity:GetID();
		Helper:CheckExecute( "Attack/Chat" );
		return false;
	end
	
	-- Initial Attack 2: Meteor Strike
	if Helper:CheckAvailable( "Meteor Strike" ) then
		Helper:CheckExecute( "Meteor Strike" );
		return false;
	end

	-- Initial Attack 3: Hallowed Strike
	if Helper:CheckAvailable( "Hallowed Strike" ) then
		Helper:CheckExecute( "Hallowed Strike" );
		return false;
	end
		
	-- Nothing was executed, continue with other functions.
	return true;

end

--- Perform healing checks both in and our of combat.
--
-- @param	bool	Indicates whether or not the function is running before force checks.
-- @return	bool

function Heal( BeforeForce )
	
	-- Nothing was executed, continue with other functions.
	return true;
	
end

--- Perform the safety checks before moving to the next target.
--
-- @return	bool

function Pause()
		
	--------------------------------------------------
	--                H E A L I N G                 --
	--------------------------------------------------
		
	-- Heal 5: Word of Revival (Also in Attack)
	if Player:GetHealthCurrent() < Player:GetHealthMaximum() and Player:GetState():GetState( Helper:CheckName( "Rebirth Spell" )) == nil and Helper:CheckAvailable( "Word of Revival" ) then
		Helper:CheckExecute( "Rebirth Spell", Player );
		return false;
	end
	
	-- Heal 6: Magic Recovery
	if Helper:CheckAvailable( "Stamina Restoration" ) and Player:GetManaCurrent() < Player:GetManaMaximum() - 2500 then
		Helper:CheckExecute( "Stamina Restoration", Player );
		return false;
	end
-- Emergency!: Divine Curtain
	if Helper:CheckAvailable( "Divine Curtain" ) and Player:GetHealth() < 40 then
		Helper:CheckExecute( "Divine Curtain" );
		return false;
	end
	
	-- Heal 0: Non-Priority Healing
	self:_Heal( Player, false );
	
	--------------------------------------------------
	--                B U F F I N G                 --
	--------------------------------------------------

	-- Check if the state checking timer has expired.
	if ( self.StateBuffTime == nil or self.StateBuffTime < Time()) then

		-- Retrieve the state.
		local EntityState = Player:GetState();
		
		-- Buff 0: Blessing of Health
		if Helper:CheckAvailable( "Word of Awakening" ) and EntityState:GetState( "Word of Awakening" ) == nil and EntityState:GetState( "Word of Awakening" ) == nil then
			Helper:CheckExecute( "Word of Awakening", Player );
			return false;
		end
		
		-- Buff 1: Blessing of Health
		if Helper:CheckAvailable( "Prayer of Protection" ) and EntityState:GetState( "Prayer of Protection" ) == nil and EntityState:GetState( "Prayer of Protection" ) == nil then
			Helper:CheckExecute( "Prayer of Protection", Player );
			return false;
		end
		
		-- Buff 2: Blessing of Rock/Blessing of Stone
		if EntityState:GetState( "Blessing of Rock" ) == nil and EntityState:GetState( "Prayer of Protection" ) == nil then
		
			-- Buff 2: Blessing of Rock
			if Helper:CheckAvailable( "Prayer of Protection" ) then
				Helper:CheckExecute( "Prayer of Protection", Player );
				return false;
			-- Buff 2: Blessing of Stone
			elseif Helper:CheckAvailable( "Blessing of Rock" )  then
				Helper:CheckExecute( "Blessing of Rock", Player );
				return false;
			end

		end

		-- Buff 3: Promise of Earth
		if Helper:CheckAvailable( "Promise of Earth" ) and EntityState:GetState( Helper:CheckName( "Promise of Earth" )) == nil  then
			Helper:CheckExecute( "Promise of Earth", Player );
			return false;
		end

		-- Buff 3: Rage Spell
		if Helper:CheckAvailable( "Rage Spell" ) and EntityState:GetState( "Rage Spell" ) == nil then
			Helper:CheckExecute( "Rage Spell", Player );
			return false;
		end
		
		-- Update the state checking timer.
		self.StateBuffTime = Time() + 1000;
		
	end
		
	-- Nothing was executed, continue with other functions.
	return true;
	
end
---------------Buff Scrolls-------------
function CheckCritFood()

stateID = {10224,10225,9976,9989,10051,10064};
foodName = {"Calydon Meat Dumpling","Wild Ginseng Pickle","Tasty Calydon Meat Dumpling","Tasty Wild Ginseng Pickle","Innesi Herb Dumpling","Poma Wine Herb Dumpling","Tasty Innesi Herb Dumpling","Tasty Poma Wine Herb Dumpling"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end


return true;
end

--------------------------------
function CheckAttackFood()

stateID = {10051,10064,10224,10225,9976,9989};
foodName = {"Nutritious Abex Cheese Soup","Minor Focus Agent","Lesser Focus Agent","Focus Agent","Greater Focus Agent","Major Focus Agent","Fine Focus Agent"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;


end
-----------------------------------
function CheckNaturalHeal()

stateID = {10044,10094};
foodName = {"Minor Rally Serum","Lesser Rally Serum","Rally Serum","Greater Rally Serum","Major Rally Serum","Fine Rally Serum","Tasty Ormea Cocktail"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
-------------------------------------
function CheckAttackScroll()

stateID = {9959};
foodName = {"Courage Scroll"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
--------------------------
function CheckRunScroll()

stateID = {9960};
foodName = {"[Jakunerk] Icy Normal Running Scroll"};
flag = 0;

for _,v in ipairs(stateID) do
if Player:GetState():GetState( v ) ~= nil then
flag = flag + 1;
end
end

if flag == 0 then
for a,b in ipairs(foodName) do
if Helper:CheckAvailableInventory( b ) then
PlayerInput:Inventory( b );
break;
end
end
end
return true;

end
Anyone can tell me how is working food and scrolls code? I want to do one with awakening scrolls/running scrolls and fine focus agent.

locatelli
VIP
Posts: 71
Joined: Mon Jan 16, 2017 10:38 pm
Has thanked: 11 times
Been thanked: 8 times

Re: Official: Chanter.lua

Post by locatelli » Sat Jul 22, 2017 8:19 am

Uploaded a new revision of the script, which I was keeping onyl for myself for a while, but it may be the last one since I'm quitting the game.
It should be the definitive one for botting! It works perfectly, I honestly think it is impossible to make anything better.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest