ShareHandler.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package com.gmail.nossr50.party;
  2. import com.gmail.nossr50.datatypes.experience.XPGainReason;
  3. import com.gmail.nossr50.datatypes.experience.XPGainSource;
  4. import com.gmail.nossr50.datatypes.party.ItemShareType;
  5. import com.gmail.nossr50.datatypes.party.Party;
  6. import com.gmail.nossr50.datatypes.party.ShareMode;
  7. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  8. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  9. import com.gmail.nossr50.mcMMO;
  10. import com.gmail.nossr50.util.ItemUtils;
  11. import com.gmail.nossr50.util.Misc;
  12. import org.bukkit.Material;
  13. import org.bukkit.entity.Item;
  14. import org.bukkit.entity.Player;
  15. import org.bukkit.inventory.ItemStack;
  16. import java.util.List;
  17. public final class ShareHandler {
  18. private final mcMMO pluginRef;
  19. private Party party;
  20. public ShareHandler(mcMMO pluginRef, Party party) {
  21. this.pluginRef = pluginRef;
  22. this.party = party;
  23. }
  24. /**
  25. * Distribute Xp amongst party members.
  26. *
  27. * @param xp Xp without party sharing
  28. * @param mcMMOPlayer Player initiating the Xp gain
  29. * @param primarySkillType Skill being used
  30. * @return True is the xp has been shared
  31. */
  32. public boolean handleXpShare(double xp, McMMOPlayer mcMMOPlayer, PrimarySkillType primarySkillType, XPGainReason xpGainReason) {
  33. if (party.getXpShareMode() != ShareMode.EQUAL) {
  34. return false;
  35. }
  36. List<Player> nearMembers = pluginRef.getPartyManager().getNearVisibleMembers(mcMMOPlayer);
  37. if (nearMembers.isEmpty()) {
  38. return false;
  39. }
  40. nearMembers.add(mcMMOPlayer.getPlayer());
  41. int partySize = nearMembers.size();
  42. double shareBonus = Math.min(pluginRef.getPartyXPShareSettings().getPartyShareXPBonusBase()
  43. + (partySize * pluginRef.getPartyXPShareSettings().getPartyShareBonusIncrease()),
  44. pluginRef.getPartyXPShareSettings().getPartyShareBonusCap());
  45. double splitXp = (xp / partySize * shareBonus);
  46. for (Player member : nearMembers) {
  47. //Profile not loaded
  48. if (pluginRef.getUserManager().getPlayer(member) == null) {
  49. continue;
  50. }
  51. pluginRef.getUserManager().getPlayer(member).beginUnsharedXpGain(primarySkillType, splitXp, xpGainReason, XPGainSource.PARTY_MEMBERS);
  52. }
  53. return true;
  54. }
  55. /**
  56. * Distribute Items amongst party members.
  57. *
  58. * @param drop Item that will get shared
  59. * @param mcMMOPlayer Player who picked up the item
  60. * @return True if the item has been shared
  61. */
  62. public boolean handleItemShare(Item drop, McMMOPlayer mcMMOPlayer) {
  63. ItemStack itemStack = drop.getItemStack();
  64. ItemShareType dropType = getShareType(itemStack);
  65. if (dropType == null) {
  66. return false;
  67. }
  68. if (!party.sharingDrops(dropType)) {
  69. return false;
  70. }
  71. ShareMode shareMode = party.getItemShareMode();
  72. if (shareMode == ShareMode.NONE) {
  73. return false;
  74. }
  75. List<Player> nearMembers = pluginRef.getPartyManager().getNearMembers(mcMMOPlayer);
  76. if (nearMembers.isEmpty()) {
  77. return false;
  78. }
  79. Player winningPlayer = null;
  80. ItemStack newStack = itemStack.clone();
  81. nearMembers.add(mcMMOPlayer.getPlayer());
  82. int partySize = nearMembers.size();
  83. drop.remove();
  84. newStack.setAmount(1);
  85. switch (shareMode) {
  86. case EQUAL:
  87. int itemWeight = getItemWeight(itemStack.getType());
  88. for (int i = 0; i < itemStack.getAmount(); i++) {
  89. int highestRoll = 0;
  90. for (Player member : nearMembers) {
  91. McMMOPlayer mcMMOMember = pluginRef.getUserManager().getPlayer(member);
  92. //Profile not loaded
  93. if (pluginRef.getUserManager().getPlayer(member) == null) {
  94. continue;
  95. }
  96. int itemShareModifier = mcMMOMember.getItemShareModifier();
  97. int diceRoll = Misc.getRandom().nextInt(itemShareModifier);
  98. if (diceRoll <= highestRoll) {
  99. mcMMOMember.setItemShareModifier(itemShareModifier + itemWeight);
  100. continue;
  101. }
  102. highestRoll = diceRoll;
  103. if (winningPlayer != null) {
  104. McMMOPlayer mcMMOWinning = pluginRef.getUserManager().getPlayer(winningPlayer);
  105. mcMMOWinning.setItemShareModifier(mcMMOWinning.getItemShareModifier() + itemWeight);
  106. }
  107. winningPlayer = member;
  108. }
  109. McMMOPlayer mcMMOTarget = pluginRef.getUserManager().getPlayer(winningPlayer);
  110. mcMMOTarget.setItemShareModifier(mcMMOTarget.getItemShareModifier() - itemWeight);
  111. awardDrop(winningPlayer, newStack);
  112. }
  113. return true;
  114. case RANDOM:
  115. for (int i = 0; i < itemStack.getAmount(); i++) {
  116. winningPlayer = nearMembers.get(Misc.getRandom().nextInt(partySize));
  117. awardDrop(winningPlayer, newStack);
  118. }
  119. return true;
  120. default:
  121. return false;
  122. }
  123. }
  124. public ItemShareType getShareType(ItemStack itemStack) {
  125. if (ItemUtils.isMobDrop(itemStack)) {
  126. return ItemShareType.LOOT;
  127. } else if (ItemUtils.isMiningDrop(itemStack)) {
  128. return ItemShareType.MINING;
  129. } else if (ItemUtils.isHerbalismDrop(itemStack)) {
  130. return ItemShareType.HERBALISM;
  131. } else if (ItemUtils.isWoodcuttingDrop(itemStack)) {
  132. return ItemShareType.WOODCUTTING;
  133. } else if (pluginRef.getConfigManager().getConfigParty().getPartyItemShare().getItemShareMap().get(itemStack.getType()) != null) {
  134. return ItemShareType.MISC;
  135. }
  136. return null;
  137. }
  138. private int getItemWeight(Material material) {
  139. if (pluginRef.getConfigManager().getConfigParty().getPartyItemShare().getItemShareMap().get(material) == null)
  140. return 5;
  141. else
  142. return pluginRef.getConfigManager().getConfigParty().getPartyItemShare().getItemShareMap().get(material);
  143. }
  144. public XPGainReason getSharedXpGainReason(XPGainReason xpGainReason) {
  145. if (xpGainReason == XPGainReason.PVE) {
  146. return XPGainReason.SHARED_PVE;
  147. } else if (xpGainReason == XPGainReason.PVP) {
  148. return XPGainReason.SHARED_PVP;
  149. } else {
  150. return xpGainReason;
  151. }
  152. }
  153. private void awardDrop(Player winningPlayer, ItemStack drop) {
  154. if (winningPlayer.getInventory().addItem(drop).size() != 0) {
  155. winningPlayer.getWorld().dropItem(winningPlayer.getLocation(), drop);
  156. }
  157. winningPlayer.updateInventory();
  158. }
  159. }