/* * 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.ai.CtrlIntention; import silentium.gameserver.handler.ISkillHandler; import silentium.gameserver.model.L2Manor; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.L2Skill; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.actor.instance.L2MonsterInstance; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.quest.QuestState; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.ActionFailed; import silentium.gameserver.network.serverpackets.PlaySound; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.templates.skills.L2SkillType; /** * @author l3x */ public class Sow implements ISkillHandler { private static final L2SkillType[] SKILL_IDS = { L2SkillType.SOW }; @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 || targetList.length == 0) return; final L2PcInstance player = (L2PcInstance) activeChar; L2MonsterInstance target; for (final L2Object tgt : targetList) { if (!(tgt instanceof L2MonsterInstance)) continue; target = (L2MonsterInstance) tgt; if (target.isDead() || target.isSeeded() || target.getSeederId() != activeChar.getObjectId()) { activeChar.sendPacket(ActionFailed.STATIC_PACKET); continue; } final int seedId = target.getSeedType(); if (seedId == 0) { activeChar.sendPacket(ActionFailed.STATIC_PACKET); continue; } // Consuming used seed if (!activeChar.destroyItemByItemId("Consume", seedId, 1, target, false)) { activeChar.sendPacket(ActionFailed.STATIC_PACKET); return; } final SystemMessage sm; if (calcSuccess(activeChar, target, seedId)) { player.sendPacket(new PlaySound(QuestState.SOUND_ITEMGET)); target.setSeeded((L2PcInstance) activeChar); sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_SUCCESSFULLY_SOWN); } else sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_NOT_SOWN); if (!player.isInParty()) player.sendPacket(sm); else player.getParty().broadcastToPartyMembers(sm); target.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); } } private static boolean calcSuccess(final L2Character activeChar, final L2Character target, final int seedId) { int basicSuccess = L2Manor.getInstance().isAlternative(seedId) ? 20 : 90; final int minlevelSeed = L2Manor.getInstance().getSeedMinLevel(seedId); final int maxlevelSeed = L2Manor.getInstance().getSeedMaxLevel(seedId); final int levelPlayer = activeChar.getLevel(); // Attacker Level final int levelTarget = target.getLevel(); // target Level // Seed level if (levelTarget < minlevelSeed) basicSuccess -= 5 * (minlevelSeed - levelTarget); if (levelTarget > maxlevelSeed) basicSuccess -= 5 * (levelTarget - maxlevelSeed); // 5% decrease in chance if player level is more than +/- 5 levels to _target's_ level int diff = levelPlayer - levelTarget; if (diff < 0) diff = -diff; if (diff > 5) basicSuccess -= 5 * (diff - 5); // Chance can't be less than 1% if (basicSuccess < 1) basicSuccess = 1; return Rnd.nextInt(99) < basicSuccess; } @Override public L2SkillType[] getSkillIds() { return SKILL_IDS; } }