Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * 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.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.ai.ext.tasks;
- import com.l2jserver.gameserver.ai.ext.AI_TaskQueue;
- import com.l2jserver.gameserver.ai.ext.struct.task.AITaskSimpleVar;
- import com.l2jserver.gameserver.model.L2Object;
- import com.l2jserver.gameserver.model.L2Skill;
- import com.l2jserver.gameserver.model.actor.L2Attackable;
- import com.l2jserver.gameserver.model.actor.L2Character;
- import com.l2jserver.util.Rnd;
- /**
- * ==============================================<br>
- * UseAtkSkillTask - Insert description...<br>
- * ==============================================<br>
- */
- public class UseAtkSkillTask extends AbstractAITask
- {
- private final L2Character target;
- public UseAtkSkillTask(L2Character actor, L2Character target)
- {
- super(actor.getTaskQueue(), 0, true, true, 1, actor);
- this.target = target;
- setWeights();
- }
- protected void setWeights()
- {
- int chance = 1 + Rnd.qget(getActor().getMinSkillChance(), getActor().getMaxSkillChance());
- setWeight(calculateWeightForPercentage(chance), true);
- setWeight(calculateWeightForPercentage(chance), false);
- }
- @Override
- protected void initTaskTypeName()
- {
- _name = "UseAtkSkillTask";
- }
- @Override
- public L2Attackable getActor()
- {
- return (L2Attackable)super.getActor();
- }
- public L2Character getTarget()
- {
- return target;
- }
- @Override
- public boolean valid()
- {
- return hasAI() && !getActor().isAlikeDead() && !getActor().getCombatData().getSelfAnalysis().getSkillRender().getAtkSkills().isEmpty()
- && getAI().getIntention().isAttackingMode() && target != null && getAI().getRangesCalc().isPawnRangeInfoRegistered(target) && !target.isAlikeDead();
- }
- @Override
- public boolean ready()
- {
- return getActor().getRangesCalc().canSee(target) && getActor().getCurrentMPPercentage() > 5;
- }
- @Override
- public boolean waiting(int cycle)
- {
- return super.waiting(cycle) || getActor().isCastingNow() || !getAI().canTryCast(null);
- }
- @Override
- public boolean run()
- {
- L2Attackable npc = (L2Attackable)getActor();
- if (target == null || target.isAlikeDead() || target.isSleeping())
- return false;
- if (!npc.getCombatData().getSelfAnalysis().getSkillRender().getAtkSkills().isEmpty())
- {
- L2Object oldTarget = npc.getTarget();
- double distance = getActor().getRangesCalc().getPawnRangeInfo(target).getDistance(true);
- int retry = npc.getCombatData().getSelfAnalysis().getSkillRender().getAtkSkills().size();
- L2Skill skill = null;
- while(retry > 0)
- {
- retry--;
- //--------------------------------------------------------------------------------
- //Long/Short Range skill Usage
- if ((npc.getLSkillChance() > 0 && npc.getCombatData().getSelfAnalysis().getSkillRender().hasLrangeSkill()) || (npc.getSSkillChance() > 0 && npc.getCombatData().getSelfAnalysis().getSkillRender().hasSrangeSkill()))
- {
- // short range
- if (npc.getCombatData().getSelfAnalysis().getSkillRender().hasSrangeSkill() && distance <= 150 && Rnd.qchance(npc.getSSkillChance()))
- {
- if (!getAI().getSelfAnalysis().getSkillRender().getShortRangeSkills().isEmpty())
- skill = npc.getCombatData().getSelfAnalysis().getSkillRender().selectTopSkillByDamage(target, distance, false, npc.getCombatData().getSelfAnalysis().getSkillRender().getShortRangeSkills());
- }
- // long range
- if (npc.getCombatData().getSelfAnalysis().getSkillRender().hasLrangeSkill() && distance > 150 && Rnd.qchance(npc.getLSkillChance()))
- {
- if (!getAI().getSelfAnalysis().getSkillRender().getLongRangeSkills().isEmpty())
- skill = npc.getCombatData().getSelfAnalysis().getSkillRender().selectTopSkillByDamage(target, distance, false, npc.getCombatData().getSelfAnalysis().getSkillRender().getLongRangeSkills());
- }
- }
- //--------------------------------------------------------------------------------
- //Try other attack skill if none selected yet
- if (skill == null)
- skill = npc.getCombatData().getSelfAnalysis().getSkillRender().selectTopSkillByDamage(target, distance, false, npc.getCombatData().getSelfAnalysis().getSkillRender().getAtkSkills());
- if (skill != null)
- {
- npc.setTarget(target);
- if (npc.doCast(skill))
- {
- npc.setTarget(oldTarget);
- setWeight(weight(true), false);
- return true;
- }
- else
- skill = null;
- }
- }
- npc.setTarget(oldTarget);
- }
- return false;
- }
- @Override
- public boolean block_think_after_run()
- {
- return true;
- }
- @Override
- public int update_weight()
- {
- return weight(false) + calculateWeightForPercentage(1);
- }
- @Override
- public boolean valid_update_weight_delay()
- {
- return getLastWeightUpdateTimestamp() <= 0 || System.currentTimeMillis() - getLastWeightUpdateTimestamp() > 15000;
- }
- @Override
- public boolean removeable()
- {
- return !valid();
- }
- @Override
- public boolean valid_run_delay()
- {
- return getTaskLastExecTimestamp(false) <= 0 || System.currentTimeMillis() - getTaskLastExecTimestamp(false) > (getActor().getCombatData().getSelfAnalysis().isMage() || getActor().getCombatData().getSelfAnalysis().isHealer() || getActor().getCombatData().getSelfAnalysis().isBalanced() ? 7500 : 15000);
- }
- @Override
- public int max_task_instances()
- {
- return 1;
- }
- @Override
- public void on_variable_listener(AITaskSimpleVar.LISTENER_EVENTS event, AITaskSimpleVar variable)
- {
- // ignored
- }
- @Override
- public void on_added_to_queue(AI_TaskQueue queue)
- {
- // ignored
- }
- @Override
- public void on_remove_from_queue(AI_TaskQueue queue)
- {
- // ignored
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement