Harvesting.java 5.2 KB

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