/* * 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 2, 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package net.sf.l2j.gameserver.model.actor.instance; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.idfactory.IdFactory; import net.sf.l2j.gameserver.datatables.NpcTable; import net.sf.l2j.gameserver.datatables.PolymorphMonstersTable; import net.sf.l2j.gameserver.datatables.PolyInfo; import net.sf.l2j.gameserver.datatables.SpawnTable; import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.L2Spawn; import net.sf.l2j.gameserver.templates.L2NpcTemplate; class L2PolymorphInstance extends L2MonsterInstance { private L2Spawn _baseSpawn = null; private int _polyCount = 0; public class PolySpawnTask implements Runnable { private PolyInfo _polyInfo = null; private L2Spawn _baseSpawn = null; private int _polyCount = 0; public PolySpawnTask(PolyInfo polyInfo, L2Spawn baseSpawn, int polyCount) { _polyInfo = polyInfo; _baseSpawn = baseSpawn; _polyCount = polyCount; } public void run() { L2NpcTemplate template = NpcTable.getInstance().getTemplate(_polyInfo.getPolyId()); if (template == null) { _baseSpawn.startRespawn(); return; } new L2PolymorphInstance(IdFactory.getInstance().getNextId(), template, _baseSpawn, _polyCount+1); } } public L2PolymorphInstance(int objectId, L2NpcTemplate template, L2Spawn baseSpawn, int polyCount) { super(objectId, template); _baseSpawn = baseSpawn; _polyCount = polyCount; try { L2Spawn me = new L2Spawn(template); setSpawn(me); me.setLocx(_baseSpawn.getLocx()); me.setLocy(_baseSpawn.getLocy()); me.setLocz(_baseSpawn.getLocz()); me.setAmount(1); me.setHeading(_baseSpawn.getHeading()); me.setRespawnDelay(60); SpawnTable.getInstance().addNewSpawn(me, false); me.init(); me.getLastSpawn().decayMe(); me.getLastSpawn().spawnMe(_baseSpawn.getLocx(), _baseSpawn.getLocx(), _baseSpawn.getLocx()); } catch (Exception e) {} } public void doDie(L2Character killer) { deleteMe(); PolyInfo polyInfo = PolymorphMonstersTable.getInstance().getPolyInfo(_baseSpawn.getLastSpawn().getNpcId(), _polyCount+1); if (polyInfo == null) _baseSpawn.startRespawn(); else ThreadPoolManager.getInstance().scheduleGeneral(new PolySpawnTask(polyInfo, _baseSpawn, _polyCount), polyInfo.getSpawnDelay()); super.doDie(killer); } }