Harvesting.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * Copyright (C) 2004-2013 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package handlers.effecthandlers;
  20. import com.l2jserver.Config;
  21. import com.l2jserver.gameserver.model.L2Object;
  22. import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
  23. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  24. import com.l2jserver.gameserver.model.effects.EffectTemplate;
  25. import com.l2jserver.gameserver.model.effects.L2Effect;
  26. import com.l2jserver.gameserver.model.effects.L2EffectType;
  27. import com.l2jserver.gameserver.model.holders.ItemHolder;
  28. import com.l2jserver.gameserver.model.stats.Env;
  29. import com.l2jserver.gameserver.network.SystemMessageId;
  30. import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
  31. import com.l2jserver.gameserver.network.serverpackets.ItemList;
  32. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  33. import com.l2jserver.util.Rnd;
  34. /**
  35. * Harvesting effect.
  36. * @author l3x, Zoey76
  37. */
  38. public class Harvesting extends L2Effect
  39. {
  40. public Harvesting(Env env, EffectTemplate template)
  41. {
  42. super(env, template);
  43. }
  44. @Override
  45. public boolean onStart()
  46. {
  47. if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isNpc() || !getEffected().isDead())
  48. {
  49. return false;
  50. }
  51. final L2PcInstance player = getEffector().getActingPlayer();
  52. final L2Object[] targets = getSkill().getTargetList(player, false, getEffected());
  53. if ((targets == null) || (targets.length == 0))
  54. {
  55. return false;
  56. }
  57. L2MonsterInstance monster;
  58. final InventoryUpdate iu = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
  59. for (L2Object target : targets)
  60. {
  61. if ((target == null) || !target.isMonster())
  62. {
  63. continue;
  64. }
  65. monster = (L2MonsterInstance) target;
  66. if (player.getObjectId() != monster.getSeederId())
  67. {
  68. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_HARVEST);
  69. player.sendPacket(sm);
  70. continue;
  71. }
  72. boolean send = false;
  73. int total = 0;
  74. int cropId = 0;
  75. if (monster.isSeeded())
  76. {
  77. if (calcSuccess(player, monster))
  78. {
  79. final ItemHolder[] items = monster.takeHarvest();
  80. if ((items != null) && (items.length > 0))
  81. {
  82. for (ItemHolder reward : items)
  83. {
  84. cropId = reward.getId(); // always got 1 type of crop as reward
  85. if (player.isInParty())
  86. {
  87. player.getParty().distributeItem(player, reward, true, monster);
  88. }
  89. else
  90. {
  91. if (iu != null)
  92. {
  93. iu.addItem(player.getInventory().addItem("Harvesting", reward.getId(), reward.getCount(), player, monster));
  94. }
  95. send = true;
  96. total += reward.getCount();
  97. }
  98. }
  99. if (send)
  100. {
  101. SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S1_S2);
  102. smsg.addNumber(total);
  103. smsg.addItemName(cropId);
  104. player.sendPacket(smsg);
  105. if (player.isInParty())
  106. {
  107. smsg = SystemMessage.getSystemMessage(SystemMessageId.C1_HARVESTED_S3_S2S);
  108. smsg.addString(player.getName());
  109. smsg.addNumber(total);
  110. smsg.addItemName(cropId);
  111. player.getParty().broadcastToPartyMembers(player, smsg);
  112. }
  113. if (iu != null)
  114. {
  115. player.sendPacket(iu);
  116. }
  117. else
  118. {
  119. player.sendPacket(new ItemList(player, false));
  120. }
  121. return true;
  122. }
  123. }
  124. }
  125. else
  126. {
  127. player.sendPacket(SystemMessageId.THE_HARVEST_HAS_FAILED);
  128. }
  129. }
  130. else
  131. {
  132. player.sendPacket(SystemMessageId.THE_HARVEST_FAILED_BECAUSE_THE_SEED_WAS_NOT_SOWN);
  133. }
  134. }
  135. return false;
  136. }
  137. /**
  138. * @param activeChar
  139. * @param target
  140. * @return
  141. */
  142. private boolean calcSuccess(L2PcInstance activeChar, L2MonsterInstance target)
  143. {
  144. int basicSuccess = 100;
  145. final int levelPlayer = activeChar.getLevel();
  146. final int levelTarget = target.getLevel();
  147. int diff = (levelPlayer - levelTarget);
  148. if (diff < 0)
  149. {
  150. diff = -diff;
  151. }
  152. // apply penalty, target <=> player levels
  153. // 5% penalty for each level
  154. if (diff > 5)
  155. {
  156. basicSuccess -= (diff - 5) * 5;
  157. }
  158. // success rate can't be less than 1%
  159. if (basicSuccess < 1)
  160. {
  161. basicSuccess = 1;
  162. }
  163. return Rnd.nextInt(99) < basicSuccess;
  164. }
  165. @Override
  166. public boolean onActionTime()
  167. {
  168. return false;
  169. }
  170. @Override
  171. public L2EffectType getEffectType()
  172. {
  173. return L2EffectType.HARVESTING;
  174. }
  175. }