/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server 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. * * L2J Server 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.model.actor.instance; import java.util.concurrent.Future; import java.util.logging.Level; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Decoy; import com.l2jserver.gameserver.model.actor.knownlist.DecoyKnownList; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.taskmanager.DecayTaskManager; public class L2DecoyInstance extends L2Decoy { private int _totalLifeTime; private int _timeRemaining; private Future<?> _DecoyLifeTask; private Future<?> _HateSpam; /** * Creates a decoy. * @param template the decoy NPC template * @param owner the owner * @param totalLifeTime the total life time */ public L2DecoyInstance(L2NpcTemplate template, L2PcInstance owner, int totalLifeTime) { super(template, owner); setInstanceType(InstanceType.L2DecoyInstance); _totalLifeTime = totalLifeTime; _timeRemaining = _totalLifeTime; int skilllevel = getTemplate().getDisplayId() - 13070; _DecoyLifeTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new DecoyLifetime(getOwner(), this), 1000, 1000); _HateSpam = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new HateSpam(this, SkillData.getInstance().getSkill(5272, skilllevel)), 2000, 5000); } @Override public boolean doDie(L2Character killer) { if (!super.doDie(killer)) { return false; } if (_HateSpam != null) { _HateSpam.cancel(true); _HateSpam = null; } _totalLifeTime = 0; DecayTaskManager.getInstance().add(this); return true; } @Override public DecoyKnownList getKnownList() { return (DecoyKnownList) super.getKnownList(); } @Override public void initKnownList() { setKnownList(new DecoyKnownList(this)); } static class DecoyLifetime implements Runnable { private final L2PcInstance _activeChar; private final L2DecoyInstance _Decoy; DecoyLifetime(L2PcInstance activeChar, L2DecoyInstance Decoy) { _activeChar = activeChar; _Decoy = Decoy; } @Override public void run() { try { _Decoy.decTimeRemaining(1000); double newTimeRemaining = _Decoy.getTimeRemaining(); if (newTimeRemaining < 0) { _Decoy.unSummon(_activeChar); } } catch (Exception e) { _log.log(Level.SEVERE, "Decoy Error: ", e); } } } private static class HateSpam implements Runnable { private final L2DecoyInstance _activeChar; private final Skill _skill; HateSpam(L2DecoyInstance activeChar, Skill Hate) { _activeChar = activeChar; _skill = Hate; } @Override public void run() { try { _activeChar.setTarget(_activeChar); _activeChar.doCast(_skill); } catch (Throwable e) { _log.log(Level.SEVERE, "Decoy Error: ", e); } } } @Override public void unSummon(L2PcInstance owner) { if (_DecoyLifeTask != null) { _DecoyLifeTask.cancel(true); _DecoyLifeTask = null; } if (_HateSpam != null) { _HateSpam.cancel(true); _HateSpam = null; } super.unSummon(owner); } public void decTimeRemaining(int value) { _timeRemaining -= value; } public int getTimeRemaining() { return _timeRemaining; } public int getTotalLifeTime() { return _totalLifeTime; } }