/* * 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 silentium.scripts.handlers.skill; import silentium.commons.utils.Rnd; import silentium.gameserver.configs.MainConfig; import silentium.gameserver.handler.ISkillHandler; import silentium.gameserver.model.L2ItemInstance; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.L2Skill; import silentium.gameserver.model.actor.L2Attackable; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.actor.instance.L2MonsterInstance; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.InventoryUpdate; import silentium.gameserver.network.serverpackets.ItemList; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.templates.skills.L2SkillType; /** * @author l3x */ public class Harvest implements ISkillHandler { private static final L2SkillType[] SKILL_IDS = { L2SkillType.HARVEST }; @Override public void useSkill(final L2Character activeChar, final L2Skill skill, final L2Object... targets) { if (!(activeChar instanceof L2PcInstance)) return; final L2Object[] targetList = skill.getTargetList(activeChar); if (targetList == null) return; final L2PcInstance player = (L2PcInstance) activeChar; L2MonsterInstance target; final InventoryUpdate iu = MainConfig.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (final L2Object tgt : targetList) { if (!(tgt instanceof L2MonsterInstance)) continue; target = (L2MonsterInstance) tgt; if (player.getObjectId() != target.getSeederId()) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_HARVEST); continue; } boolean send = false; int total = 0; int cropId = 0; // TODO: check items and amount of items player harvest if (target.isSeeded()) { if (calcSuccess(player, target)) { final L2Attackable.RewardItem[] items = target.takeHarvest(); if (items != null && items.length > 0) { for (final L2Attackable.RewardItem ritem : items) { cropId = ritem.getItemId(); // always got 1 type of crop as reward if (player.isInParty()) player.getParty().distributeItem(player, ritem, true, target); else { final L2ItemInstance item = player.getInventory().addItem("Manor", ritem.getItemId(), ritem.getCount(), player, target); if (iu != null) iu.addItem(item); send = true; total += ritem.getCount(); } } if (send) { SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S1_S2); smsg.addNumber(total); smsg.addItemName(cropId); player.sendPacket(smsg); if (player.isInParty()) { smsg = SystemMessage.getSystemMessage(SystemMessageId.S1_HARVESTED_S3_S2S); smsg.addPcName(player); smsg.addNumber(total); smsg.addItemName(cropId); player.getParty().broadcastToPartyMembers(player, smsg); } if (iu != null) player.sendPacket(iu); else player.sendPacket(new ItemList(player, false)); smsg = null; } } } else player.sendPacket(SystemMessageId.THE_HARVEST_HAS_FAILED); } else player.sendPacket(SystemMessageId.THE_HARVEST_FAILED_BECAUSE_THE_SEED_WAS_NOT_SOWN); } } private static boolean calcSuccess(final L2Character activeChar, final L2Character target) { int basicSuccess = 100; final int levelPlayer = activeChar.getLevel(); final int levelTarget = target.getLevel(); int diff = levelPlayer - levelTarget; if (diff < 0) diff = -diff; // apply penalty, target <=> player levels, 5% penalty for each level if (diff > 5) basicSuccess -= (diff - 5) * 5; // success rate cant be less than 1% if (basicSuccess < 1) basicSuccess = 1; return Rnd.nextInt(99) < basicSuccess; } @Override public L2SkillType[] getSkillIds() { return SKILL_IDS; } }