ShareHandler.java 6.0 KB

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