SmeltingManager.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package com.gmail.nossr50.skills.smelting;
  2. import com.gmail.nossr50.config.Config;
  3. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  4. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  5. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  6. import com.gmail.nossr50.datatypes.skills.XPGainReason;
  7. import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillWeightedActivationCheckEvent;
  8. import com.gmail.nossr50.locale.LocaleLoader;
  9. import com.gmail.nossr50.mcMMO;
  10. import com.gmail.nossr50.skills.SkillManager;
  11. import com.gmail.nossr50.skills.mining.Mining;
  12. import com.gmail.nossr50.util.BlockUtils;
  13. import com.gmail.nossr50.util.EventUtils;
  14. import com.gmail.nossr50.util.Misc;
  15. import com.gmail.nossr50.util.Permissions;
  16. import com.gmail.nossr50.util.skills.ParticleEffectUtils;
  17. import com.gmail.nossr50.util.skills.RankUtils;
  18. import com.gmail.nossr50.util.skills.SkillActivationType;
  19. import com.gmail.nossr50.util.skills.SkillUtils;
  20. import com.gmail.nossr50.util.sounds.SoundManager;
  21. import com.gmail.nossr50.util.sounds.SoundType;
  22. import org.bukkit.ChatColor;
  23. import org.bukkit.Material;
  24. import org.bukkit.block.BlockState;
  25. import org.bukkit.entity.Player;
  26. import org.bukkit.event.inventory.FurnaceBurnEvent;
  27. import org.bukkit.inventory.FurnaceRecipe;
  28. import org.bukkit.inventory.ItemStack;
  29. import org.bukkit.inventory.meta.ItemMeta;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. public class SmeltingManager extends SkillManager {
  33. public SmeltingManager(McMMOPlayer mcMMOPlayer) {
  34. super(mcMMOPlayer, PrimarySkillType.SMELTING);
  35. }
  36. public boolean canUseFluxMining(BlockState blockState) {
  37. return getSkillLevel() >= Smelting.fluxMiningUnlockLevel && BlockUtils.affectedByFluxMining(blockState) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SMELTING_FLUX_MINING) && !mcMMO.getPlaceStore().isTrue(blockState);
  38. }
  39. public boolean isSecondSmeltSuccessful() {
  40. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SMELTING_SECOND_SMELT) && SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SMELTING_SECOND_SMELT, getPlayer(), getSkillLevel(), activationChance);
  41. }
  42. /**
  43. * Process the Flux Mining ability.
  44. *
  45. * @param blockState The {@link BlockState} to check ability activation for
  46. * @return true if the ability was successful, false otherwise
  47. */
  48. public boolean processFluxMining(BlockState blockState) {
  49. Player player = getPlayer();
  50. SubSkillWeightedActivationCheckEvent event = new SubSkillWeightedActivationCheckEvent(getPlayer(), SubSkillType.SMELTING_FLUX_MINING, Smelting.fluxMiningChance / activationChance);
  51. mcMMO.p.getServer().getPluginManager().callEvent(event);
  52. if ((event.getChance() * activationChance) > Misc.getRandom().nextInt(activationChance)) {
  53. ItemStack item = null;
  54. switch (blockState.getType()) {
  55. case IRON_ORE:
  56. item = new ItemStack(Material.IRON_INGOT);
  57. break;
  58. case GOLD_ORE:
  59. item = new ItemStack(Material.GOLD_INGOT);
  60. break;
  61. default:
  62. break;
  63. }
  64. if (item == null) {
  65. return false;
  66. }
  67. if (!EventUtils.simulateBlockBreak(blockState.getBlock(), player, true)) {
  68. return false;
  69. }
  70. // We need to distribute Mining XP here, because the block break event gets cancelled
  71. applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE);
  72. SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage());
  73. Misc.dropItems(Misc.getBlockCenter(blockState), item, isSecondSmeltSuccessful() ? 2 : 1);
  74. blockState.setType(Material.AIR);
  75. if (Config.getInstance().getFluxPickaxeSoundEnabled()) {
  76. SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ);
  77. }
  78. ParticleEffectUtils.playFluxEffect(blockState.getLocation());
  79. return true;
  80. }
  81. return false;
  82. }
  83. public static ItemStack getFluxPickaxe(Material material, int amount) {
  84. ItemStack itemStack = new ItemStack(material, amount);
  85. ItemMeta itemMeta = itemStack.getItemMeta();
  86. itemMeta.setDisplayName(ChatColor.GOLD + LocaleLoader.getString("Item.FluxPickaxe.Name"));
  87. List<String> itemLore = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList<String>();
  88. itemLore.add("mcMMO Item");
  89. itemLore.add(LocaleLoader.getString("Item.FluxPickaxe.Lore.1"));
  90. itemLore.add(LocaleLoader.getString("Item.FluxPickaxe.Lore.2", Smelting.fluxMiningUnlockLevel));
  91. itemMeta.setLore(itemLore);
  92. itemStack.setItemMeta(itemMeta);
  93. return itemStack;
  94. }
  95. public static FurnaceRecipe getFluxPickaxeRecipe(Material material) {
  96. return new FurnaceRecipe(getFluxPickaxe(material, 1), material);
  97. }
  98. /**
  99. * Increases burn time for furnace fuel.
  100. *
  101. * @param burnTime The initial burn time from the {@link FurnaceBurnEvent}
  102. */
  103. public int fuelEfficiency(int burnTime) {
  104. double burnModifier = 1 + (((double) getSkillLevel() / Smelting.burnModifierMaxLevel) * Smelting.burnTimeMultiplier);
  105. return (int) (burnTime * burnModifier);
  106. }
  107. public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) {
  108. applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE);
  109. if (isSecondSmeltSuccessful()) {
  110. ItemStack newResult = result.clone();
  111. newResult.setAmount(result.getAmount() + 1);
  112. return newResult;
  113. }
  114. return result;
  115. }
  116. public int vanillaXPBoost(int experience) {
  117. return experience * getVanillaXpMultiplier();
  118. }
  119. /**
  120. * Gets the vanilla XP multiplier
  121. *
  122. * @return the vanilla XP multiplier
  123. */
  124. public int getVanillaXpMultiplier() {
  125. return RankUtils.getRank(getPlayer(), SubSkillType.SMELTING_UNDERSTANDING_THE_ART);
  126. }
  127. }