/* * 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/>. */ /** * @author FBIagent */ package silentium.scripts.handlers.item; import silentium.gameserver.ThreadPoolManager; import silentium.gameserver.data.xml.SummonItemsData; import silentium.gameserver.handler.IItemHandler; import silentium.gameserver.model.L2ItemInstance; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.L2Spawn; import silentium.gameserver.model.L2SummonItem; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.actor.L2Npc; import silentium.gameserver.model.actor.L2Playable; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.actor.instance.L2PetInstance; import silentium.gameserver.model.actor.instance.L2XmassTreeInstance; import silentium.gameserver.model.entity.TvTEvent; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.*; import silentium.gameserver.tables.NpcTable; import silentium.gameserver.templates.chars.L2NpcTemplate; import silentium.gameserver.utils.Broadcast; import java.util.Collection; public class SummonItems implements IItemHandler { @Override public void useItem(final L2Playable playable, final L2ItemInstance item, final boolean forceUse) { if (!(playable instanceof L2PcInstance)) return; final L2PcInstance activeChar = (L2PcInstance) playable; if (!TvTEvent.onItemSummon(playable.getObjectId())) return; if (activeChar.isSitting()) { activeChar.sendPacket(SystemMessageId.CANT_MOVE_SITTING); return; } if (activeChar.inObserverMode()) return; if (activeChar.isAllSkillsDisabled() || activeChar.isCastingNow()) return; final L2SummonItem sitem = SummonItemsData.getInstance().getSummonItem(item.getItemId()); if ((activeChar.getPet() != null || activeChar.isMounted()) && sitem.isPetSummon()) { activeChar.sendPacket(SystemMessageId.SUMMON_ONLY_ONE); return; } if (activeChar.isAttackingNow()) { activeChar.sendPacket(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT); return; } if (activeChar.isCursedWeaponEquipped() && sitem.isPetSummon()) { activeChar.sendPacket(SystemMessageId.STRIDER_CANT_BE_RIDDEN_WHILE_IN_BATTLE); return; } final int npcId = sitem.getNpcId(); if (npcId == 0) return; final L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(npcId); if (npcTemplate == null) return; activeChar.stopMove(null, false); switch (sitem.getType()) { case 0: // static summons (like Christmas tree) try { final Collection<L2Character> characters = activeChar.getKnownList().getKnownCharactersInRadius(1200); for (final L2Character ch : characters) { if (ch instanceof L2XmassTreeInstance && npcTemplate.isSpecialTree()) { activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_SUMMON_S1_AGAIN).addCharName(ch)); return; } } if (activeChar.destroyItem("Summon", item.getObjectId(), 1, null, false)) { final L2Spawn spawn = new L2Spawn(npcTemplate); spawn.setLocx(activeChar.getX()); spawn.setLocy(activeChar.getY()); spawn.setLocz(activeChar.getZ()); spawn.stopRespawn(); final L2Npc npc = spawn.doSpawn(true); npc.setTitle(activeChar.getName()); npc.setIsRunning(false); // broadcast info } } catch (Exception e) { activeChar.sendPacket(SystemMessageId.TARGET_CANT_FOUND); } break; case 1: // pet summons final L2Object oldTarget = activeChar.getTarget(); activeChar.setTarget(activeChar); Broadcast.toSelfAndKnownPlayers(activeChar, new MagicSkillUse(activeChar, 2046, 1, 5000, 0)); activeChar.setTarget(oldTarget); activeChar.sendPacket(new SetupGauge(0, 5000)); activeChar.sendPacket(SystemMessageId.SUMMON_A_PET); activeChar.setIsCastingNow(true); ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFinalizer(activeChar, npcTemplate, item), 5000); break; case 2: // wyvern activeChar.mount(sitem.getNpcId(), item.getObjectId(), true); break; } } static class PetSummonFeedWait implements Runnable { private final L2PcInstance _activeChar; private final L2PetInstance _petSummon; PetSummonFeedWait(final L2PcInstance activeChar, final L2PetInstance petSummon) { _activeChar = activeChar; _petSummon = petSummon; } @Override public void run() { try { if (_petSummon.getCurrentFed() <= 0) _petSummon.unSummon(_activeChar); else _petSummon.startFeed(); } catch (Exception e) { _log.warn(e.getLocalizedMessage(), e); } } } // TODO: this should be inside skill handler static class PetSummonFinalizer implements Runnable { private final L2PcInstance _activeChar; private final L2ItemInstance _item; private final L2NpcTemplate _npcTemplate; PetSummonFinalizer(final L2PcInstance activeChar, final L2NpcTemplate npcTemplate, final L2ItemInstance item) { _activeChar = activeChar; _npcTemplate = npcTemplate; _item = item; } @Override public void run() { try { _activeChar.sendPacket(new MagicSkillLaunched(_activeChar, 2046, 1)); _activeChar.setIsCastingNow(false); // check for summon item validity if (_item == null || _item.getOwnerId() != _activeChar.getObjectId() || _item.getLocation() != L2ItemInstance.ItemLocation.INVENTORY) return; final L2PetInstance petSummon = L2PetInstance.spawnPet(_npcTemplate, _activeChar, _item); if (petSummon == null) return; petSummon.setShowSummonAnimation(true); petSummon.setTitle(_activeChar.getName()); if (!petSummon.isRespawned()) { petSummon.setCurrentHp(petSummon.getMaxHp()); petSummon.setCurrentMp(petSummon.getMaxMp()); petSummon.getStat().setExp(petSummon.getExpForThisLevel()); petSummon.setCurrentFed(petSummon.getMaxFed()); } petSummon.setRunning(); if (!petSummon.isRespawned()) petSummon.store(); _activeChar.setPet(petSummon); petSummon.spawnMe(_activeChar.getX() + 50, _activeChar.getY() + 100, _activeChar.getZ()); petSummon.startFeed(); _item.setEnchantLevel(petSummon.getLevel()); if (petSummon.getCurrentFed() <= 0) ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFeedWait(_activeChar, petSummon), 60000); else petSummon.startFeed(); petSummon.setFollowStatus(true); petSummon.getOwner().sendPacket(new PetItemList(petSummon)); petSummon.broadcastStatusUpdate(); } catch (Exception e) { _log.warn(e.getLocalizedMessage(), e); } } } }