BlastMiningDropEventHandler.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package com.gmail.nossr50.skills.mining;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.bukkit.Location;
  5. import org.bukkit.Material;
  6. import org.bukkit.block.Block;
  7. import org.bukkit.event.entity.EntityExplodeEvent;
  8. import org.bukkit.inventory.ItemStack;
  9. import com.gmail.nossr50.mcMMO;
  10. import com.gmail.nossr50.datatypes.McMMOPlayer;
  11. import com.gmail.nossr50.util.BlockChecks;
  12. import com.gmail.nossr50.util.Misc;
  13. public class BlastMiningDropEventHandler {
  14. private MiningManager manager;
  15. private int skillLevel;
  16. private EntityExplodeEvent event;
  17. private float yield;
  18. private List<Block> blocks;
  19. private List<Block> ores = new ArrayList<Block>();
  20. private List<Block> debris = new ArrayList<Block>();
  21. private List<Block> droppedOres = new ArrayList<Block>();
  22. private float oreBonus;
  23. private float debrisReduction;
  24. private int dropMultiplier;
  25. public BlastMiningDropEventHandler(MiningManager manager, EntityExplodeEvent event) {
  26. this.manager = manager;
  27. this.skillLevel = manager.getSkillLevel();
  28. this.event = event;
  29. this.yield = event.getYield();
  30. this.blocks = event.blockList();
  31. }
  32. protected void sortExplosionBlocks() {
  33. for (Block block : blocks) {
  34. if (BlockChecks.isOre(block)) {
  35. ores.add(block);
  36. }
  37. else {
  38. debris.add(block);
  39. }
  40. }
  41. }
  42. protected void processXPGain() {
  43. McMMOPlayer mcMMOPlayer = manager.getMcMMOPlayer();
  44. for (Block block : droppedOres) {
  45. if (!mcMMO.placeStore.isTrue(block)) {
  46. Mining.miningXP(mcMMOPlayer, block, block.getType());
  47. }
  48. }
  49. }
  50. protected void processDroppedBlocks() {
  51. for (Block block : ores) {
  52. Location location = block.getLocation();
  53. Material type = block.getType();
  54. if (Misc.getRandom().nextFloat() < (yield + oreBonus)) {
  55. droppedOres.add(block);
  56. Mining.miningDrops(block, location, type);
  57. if (!mcMMO.placeStore.isTrue(block)) {
  58. for (int i = 1 ; i < dropMultiplier ; i++) {
  59. droppedOres.add(block);
  60. Mining.miningDrops(block, location, type);
  61. }
  62. }
  63. }
  64. }
  65. float debrisYield = yield - debrisReduction;
  66. if (debrisYield > 0) {
  67. for (Block block : debris) {
  68. Location location = block.getLocation();
  69. Material type = block.getType();
  70. if (Misc.getRandom().nextFloat() < debrisYield) {
  71. Misc.dropItem(location, new ItemStack(type));
  72. }
  73. }
  74. }
  75. }
  76. protected void modifyEventYield() {
  77. event.setYield(0);
  78. }
  79. protected void calcuateDropModifiers() {
  80. calculateOreBonus();
  81. calculateDebrisReduction();
  82. calculateDropMultiplier();
  83. }
  84. private void calculateOreBonus() {
  85. if (skillLevel >= BlastMining.rank8) {
  86. oreBonus = .70f;
  87. }
  88. else if (skillLevel >= BlastMining.rank7) {
  89. oreBonus = .65f;
  90. }
  91. else if (skillLevel >= BlastMining.rank6) {
  92. oreBonus = .60f;
  93. }
  94. else if (skillLevel >= BlastMining.rank5) {
  95. oreBonus = .55f;
  96. }
  97. else if (skillLevel >= BlastMining.rank4) {
  98. oreBonus = .50f;
  99. }
  100. else if (skillLevel >= BlastMining.rank3) {
  101. oreBonus = .45f;
  102. }
  103. else if (skillLevel >= BlastMining.rank2) {
  104. oreBonus = .40f;
  105. }
  106. else {
  107. debrisReduction = .35f;
  108. }
  109. }
  110. private void calculateDebrisReduction() {
  111. if (skillLevel >= BlastMining.rank3) {
  112. debrisReduction = .30f;
  113. }
  114. else if (skillLevel >= BlastMining.rank2) {
  115. debrisReduction = .20f;
  116. }
  117. else {
  118. debrisReduction = .10f;
  119. }
  120. }
  121. private void calculateDropMultiplier() {
  122. if (skillLevel >= BlastMining.rank7) {
  123. dropMultiplier = 3;
  124. }
  125. else if (skillLevel >= BlastMining.rank5) {
  126. dropMultiplier = 2;
  127. }
  128. else {
  129. dropMultiplier = 1;
  130. }
  131. }
  132. }