package net.sf.l2j.gameserver.handler.itemhandlers; import java.util.Random; import net.sf.l2j.Config; import net.sf.l2j.gameserver.MapRegionTable; import net.sf.l2j.gameserver.ai.CtrlEvent; import net.sf.l2j.gameserver.ai.CtrlIntention; import net.sf.l2j.gameserver.handler.IItemHandler; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Manor; import net.sf.l2j.gameserver.model.L2MonsterInstance; import net.sf.l2j.gameserver.model.L2PcInstance; import net.sf.l2j.gameserver.model.L2PlayableInstance; import net.sf.l2j.gameserver.serverpackets.MagicSkillUser; import net.sf.l2j.gameserver.serverpackets.SystemMessage; public class Seed implements IItemHandler { private static int[] _itemIds = { // generic seeds (lo-grade) 5016,5017,5018,5019,5020,5021,5022,5023,5024, 5025,5026,5027,5028,5029,5030,5031,5032,5033, 5034,5035,5036,5037,5038,5039,5040,5041,5042, 5043,5044,5045,5046,5047,5048,5049,5050,5051, 5052,5053,5054,5055,5056,5057,5058,5059,5060, 5061,5221,5222,5223,5224,5225,5226,5227, // alternative seeds(hi-grade) 5650,5651,5652,5653,5654,5655,5656,5657,5658, 5659,5660,5661,5662,5663,5664,5665,5666,5667, 5668,5669,5670,5671,5672,5673,5674,5675,5676, 5678,5678,5679,5680,5681,5682,5683,5684,5685, 5686,5687,5688,5689,5690,5691,5692,5693,5694, 5695,5696,5697,5698,5699,5700,5701,5702 }; private int _seedId; L2MonsterInstance _target; L2PcInstance _char; public void useItem(L2PlayableInstance playable, L2ItemInstance item) { if (!(playable instanceof L2PcInstance)) return; _char = (L2PcInstance)playable; if(!(_char.getTarget() instanceof L2MonsterInstance)) { SystemMessage msg = new SystemMessage(109); _char.sendPacket(msg); return; } _target = (L2MonsterInstance)_char.getTarget(); if(_target != null && !_target.isDead() && !_target.isSeeded()) { _seedId = item.getItemId(); if(areaValid(MapRegionTable.getInstance().getClosestTownNumber(_char))) { //TODO: valid action animId for seed planting MagicSkillUser MSU = new MagicSkillUser(_char,_target,2023,1,1,0); _char.sendPacket(MSU); _char.broadcastPacket(MSU); if(calcSuccess()) { _target.setSeeded(item.getItemId(),_char.getLevel()); _char.sendMessage("The seed was successfully sown"); } else { _char.sendMessage("The seed was not sown"); } // remove seed from inv & attack target _char.removeItemFromInventory(item, 1); _target.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, _char); _char.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, _target); } else { _char.sendMessage("Wrong area for farming"); } } } public int[] getItemIds() { return _itemIds; } //FIXME: more areas checks! private boolean areaValid(int area) { switch(area) { case 5: // gludio return ((_seedId >= 5016 && _seedId <= 5023) || (_seedId >= 5650 && _seedId <= 5657)); case 7: // dion return ((_seedId >= 5024 && _seedId <= 5032) || (_seedId >= 5658 && _seedId <= 5666)); case 8: // giran return ((_seedId >= 5033 && _seedId <= 5041) || (_seedId >= 5667 && _seedId <= 5675)); case 9: // oren return ((_seedId >= 5042 && _seedId <= 5052) || (_seedId >= 5676 && _seedId <= 5686)); case 10: // aden return ((_seedId >= 5053 && _seedId <= 5061) || (_seedId >= 5687 && _seedId <= 5695)); case 13: // heine return ((_seedId >= 5221 && _seedId <= 5227) || (_seedId >= 5696 && _seedId <= 5702)); default: return false; } } private boolean calcSuccess() { int basicSuccess = Config.MANOR_BASIC_SUCCESS; int levelSeed = L2Manor.getInstance().getSeedLevel(_seedId); int levelPlayer = _char.getLevel(); int levelTarget = _target.getLevel(); int diffPlayerTarget = (levelPlayer - levelTarget); if(diffPlayerTarget < 0) diffPlayerTarget = -diffPlayerTarget; int diffSeedTarget = (levelSeed - levelTarget); if(diffSeedTarget < 0) diffSeedTarget = -diffSeedTarget; // apply penalty, target <=> player levels // 15% penalty for each level if(diffPlayerTarget > Config.MANOR_DIFF_PLAYER_TARGET) { basicSuccess -= (diffPlayerTarget - Config.MANOR_DIFF_PLAYER_TARGET)*Config.MANOR_DIFF_PLAYER_TARGET_PENALTY; } // apply penalty, seed <=> target levels // 15% penalty for each level if(diffSeedTarget > Config.MANOR_DIFF_SEED_TARGET) { basicSuccess -= (diffSeedTarget - Config.MANOR_DIFF_SEED_TARGET)*Config.MANOR_DIFF_SEED_TARGET_PENALTY; } // success rate cant be less than 1% if(basicSuccess < 1) basicSuccess = 1; Random rnd = new Random(); int rate = rnd.nextInt(99); if(rate < basicSuccess) return true; return false; } }