rendered paste bodypackage 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;
}
}