/*
* 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.model.actor.instance;
import java.util.concurrent.Future;
import java.util.logging.Level;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.datatables.SkillTable;
import com.l2jserver.gameserver.model.L2Skill;
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.skills.l2skills.L2SkillDecoy;
import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
public class L2DecoyInstance extends L2Decoy
{
private int _totalLifeTime;
private int _timeRemaining;
private Future<?> _DecoyLifeTask;
private Future<?> _HateSpam;
public L2DecoyInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, L2Skill skill)
{
super(objectId, template, owner);
setInstanceType(InstanceType.L2DecoyInstance);
if (skill != null)
{
_totalLifeTime = ((L2SkillDecoy)skill).getTotalLifeTime();
}
else
{
_totalLifeTime = 20000;
}
_timeRemaining = _totalLifeTime;
int delay = 1000;
int skilllevel = getTemplate().idTemplate - 13070;
_DecoyLifeTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new DecoyLifetime(getOwner(), this), delay, delay);
_HateSpam = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new HateSpam(this, SkillTable.getInstance().getInfo(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().addDecayTask(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 L2PcInstance _activeChar;
private L2DecoyInstance _Decoy;
DecoyLifetime(L2PcInstance activeChar, L2DecoyInstance Decoy)
{
_activeChar = activeChar;
_Decoy = Decoy;
}
public void run()
{
try
{
double newTimeRemaining;
_Decoy.decTimeRemaining(1000);
newTimeRemaining = _Decoy.getTimeRemaining();
if (newTimeRemaining < 0)
{
_Decoy.unSummon(_activeChar);
}
}
catch (Exception e)
{
_log.log(Level.SEVERE, "Decoy Error: ", e);
}
}
}
static class HateSpam implements Runnable
{
private L2DecoyInstance _activeChar;
private L2Skill _skill;
HateSpam(L2DecoyInstance activeChar, L2Skill Hate)
{
_activeChar = activeChar;
_skill = Hate;
}
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;
}
}