rendered paste body/** * */package net.sf.l2j.gameserver.taskmanager;import java.util.List;import javolution.util.FastList;import net.sf.l2j.gameserver.ClientScheduler;import net.sf.l2j.gameserver.model.L2Character;/** * @author zabbix * Lets drink to code! */public class AITaskManager{ private List<AIJob> _jobs = new FastList<AIJob>(); private List<AIJob> _cleanup = new FastList<AIJob>(); enum AIJobType { JOB_FOLLOW, JOB_FOLLOW_ATTACK } public AITaskManager() { // tick every 200msec ClientScheduler.getInstance().scheduleMedAtFixedRate(new FollowScheduler(),60000,100); } public void AddFollowTask(L2Character actor, int range) { _jobs.add(new FollowTaskJob(actor,range)); } public void RemoveFollowTask(L2Character actor) { for(AIJob job : _jobs) { if(job instanceof FollowTaskJob && ((FollowTaskJob)job)._owner.getObjectId() == actor.getObjectId()) { _cleanup.add(job); break; } } } private class FollowScheduler implements Runnable { public void run() { for(AIJob job : _jobs) { long delay = (System.currentTimeMillis() - job._lastFrame); if(job._type == AIJobType.JOB_FOLLOW && delay >= 1000) job.Tick(); else if(job._type == AIJobType.JOB_FOLLOW_ATTACK && delay >= 500) job.Tick(); } for(AIJob clean : _cleanup) { _jobs.remove(clean); } _cleanup.clear(); } } private abstract class AIJob { public AIJobType _type; public long _lastFrame; public AIJob() { _lastFrame = System.currentTimeMillis(); } public void Terminate() { _cleanup.add(this); } public abstract void Tick(); } private class FollowTaskJob extends AIJob { public int _range; public L2Character _owner; public FollowTaskJob(L2Character actor, int range) { super(); _owner = actor; _range = range; } public void Terminate() { _owner.getAI().stopFollow(); super.Terminate(); } public void Tick() { if(_owner.getAI().getFollowTarget() != null) { _owner.getAI().moveToPawn(_owner.getAI().getFollowTarget(),_range); } else { Terminate(); } } } }