FishingCommand.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.gmail.nossr50.commands.skills;
  2. import com.gmail.nossr50.config.AdvancedConfig;
  3. import com.gmail.nossr50.config.treasure.FishingTreasureConfig;
  4. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  5. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  6. import com.gmail.nossr50.datatypes.treasure.Rarity;
  7. import com.gmail.nossr50.locale.LocaleLoader;
  8. import com.gmail.nossr50.skills.fishing.Fishing;
  9. import com.gmail.nossr50.skills.fishing.FishingManager;
  10. import com.gmail.nossr50.util.Permissions;
  11. import com.gmail.nossr50.util.TextComponentFactory;
  12. import com.gmail.nossr50.util.player.UserManager;
  13. import com.gmail.nossr50.util.random.RandomChanceUtil;
  14. import com.gmail.nossr50.util.skills.RankUtils;
  15. import net.md_5.bungee.api.chat.TextComponent;
  16. import org.bukkit.Location;
  17. import org.bukkit.entity.EntityType;
  18. import org.bukkit.entity.Player;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. public class FishingCommand extends SkillCommand {
  22. private int lootTier;
  23. private String shakeChance;
  24. private String shakeChanceLucky;
  25. private int fishermansDietRank;
  26. private String biteChance;
  27. private String innerPeaceMult;
  28. private String commonTreasure;
  29. private String uncommonTreasure;
  30. private String rareTreasure;
  31. private String epicTreasure;
  32. private String legendaryTreasure;
  33. private String recordTreasure;
  34. private String magicChance;
  35. private boolean canTreasureHunt;
  36. private boolean canMagicHunt;
  37. private boolean canShake;
  38. private boolean canFishermansDiet;
  39. private boolean canMasterAngler;
  40. private boolean canIceFish;
  41. private boolean canInnerPeace;
  42. public FishingCommand() {
  43. super(PrimarySkillType.FISHING);
  44. }
  45. @Override
  46. protected void dataCalculations(Player player, float skillValue) {
  47. FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
  48. // TREASURE HUNTER
  49. if (canTreasureHunt) {
  50. lootTier = fishingManager.getLootTier();
  51. // Item drop rates
  52. commonTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.COMMON) / 100.0);
  53. uncommonTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.UNCOMMON) / 100.0);
  54. rareTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE) / 100.0);
  55. epicTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC) / 100.0);
  56. legendaryTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY) / 100.0);
  57. recordTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RECORD) / 100.0);
  58. // Magic hunter drop rates
  59. double totalEnchantChance = 0;
  60. for (Rarity rarity : Rarity.values()) {
  61. if (rarity != Rarity.RECORD) {
  62. totalEnchantChance += FishingTreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity);
  63. }
  64. }
  65. if (totalEnchantChance >= 1)
  66. magicChance = percent.format(totalEnchantChance / 100.0);
  67. else
  68. magicChance = percent.format(0);
  69. }
  70. // FISHING_SHAKE
  71. if (canShake) {
  72. String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
  73. shakeChance = shakeStrings[0];
  74. shakeChanceLucky = shakeStrings[1];
  75. }
  76. // FISHERMAN'S DIET
  77. if (canFishermansDiet) {
  78. fishermansDietRank = RankUtils.getRank(player, SubSkillType.FISHING_FISHERMANS_DIET);
  79. }
  80. // MASTER ANGLER
  81. if (canMasterAngler) {
  82. double rawBiteChance = 1.0 / (player.getWorld().hasStorm() ? 300 : 500);
  83. Location location = fishingManager.getHookLocation();
  84. if (location == null) {
  85. location = player.getLocation();
  86. }
  87. if (Fishing.getInstance().getMasterAnglerBiomes().contains(location.getBlock().getBiome())) {
  88. rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier();
  89. }
  90. if (player.isInsideVehicle() && player.getVehicle().getType() == EntityType.BOAT) {
  91. rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBoatModifier();
  92. }
  93. double luckyModifier = Permissions.lucky(player, PrimarySkillType.FISHING) ? 1.333D : 1.0D;
  94. biteChance = percent.format((rawBiteChance * 100.0D) * luckyModifier);
  95. }
  96. if (canInnerPeace) {
  97. innerPeaceMult = String.valueOf(fishingManager.getInnerPeaceMultiplier());
  98. }
  99. }
  100. @Override
  101. protected void permissionsCheck(Player player) {
  102. canTreasureHunt = canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
  103. canMagicHunt = canUseSubskill(player, SubSkillType.FISHING_MAGIC_HUNTER) && canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
  104. canShake = canUseSubskill(player, SubSkillType.FISHING_SHAKE);
  105. canFishermansDiet = canUseSubskill(player, SubSkillType.FISHING_FISHERMANS_DIET);
  106. canMasterAngler = canUseSubskill(player, SubSkillType.FISHING_MASTER_ANGLER);
  107. canIceFish = canUseSubskill(player, SubSkillType.FISHING_ICE_FISHING);
  108. canInnerPeace = canUseSubskill(player, SubSkillType.FISHING_INNER_PEACE);
  109. }
  110. @Override
  111. protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
  112. List<String> messages = new ArrayList<>();
  113. if (canFishermansDiet) {
  114. messages.add(getStatMessage(false, true, SubSkillType.FISHING_FISHERMANS_DIET, String.valueOf(fishermansDietRank)));
  115. }
  116. if (canIceFish) {
  117. messages.add(getStatMessage(SubSkillType.FISHING_ICE_FISHING, SubSkillType.FISHING_ICE_FISHING.getLocaleStatDescription()));
  118. }
  119. if (canMagicHunt) {
  120. messages.add(getStatMessage(SubSkillType.FISHING_MAGIC_HUNTER, magicChance));
  121. }
  122. if (canMasterAngler) {
  123. //TODO: Update this with more details
  124. messages.add(getStatMessage(false, true, SubSkillType.FISHING_MASTER_ANGLER, biteChance));
  125. }
  126. if (canShake) {
  127. messages.add(getStatMessage(SubSkillType.FISHING_SHAKE, shakeChance)
  128. + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shakeChanceLucky) : ""));
  129. }
  130. if (canTreasureHunt) {
  131. messages.add(getStatMessage(false, true, SubSkillType.FISHING_TREASURE_HUNTER, String.valueOf(lootTier), String.valueOf(RankUtils.getHighestRank(SubSkillType.FISHING_TREASURE_HUNTER))));
  132. messages.add(getStatMessage(true, true, SubSkillType.FISHING_TREASURE_HUNTER,
  133. String.valueOf(commonTreasure),
  134. String.valueOf(uncommonTreasure),
  135. String.valueOf(rareTreasure),
  136. String.valueOf(epicTreasure),
  137. String.valueOf(legendaryTreasure),
  138. String.valueOf(recordTreasure)));
  139. }
  140. if (canInnerPeace) {
  141. messages.add(getStatMessage(SubSkillType.FISHING_INNER_PEACE, innerPeaceMult));
  142. }
  143. return messages;
  144. }
  145. @Override
  146. protected List<TextComponent> getTextComponents(Player player) {
  147. List<TextComponent> textComponents = new ArrayList<>();
  148. TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.FISHING);
  149. return textComponents;
  150. }
  151. }