Smelting!

This commit is contained in:
GJ
2013-01-23 16:34:01 -05:00
parent 56d27c3d78
commit 6f0e2437e0
25 changed files with 734 additions and 21 deletions

View File

@ -247,6 +247,15 @@ public class Config extends ConfigLoader {
public boolean getSalvageTools() { return config.getBoolean("Skills.Repair.Salvage_tools", true); }
public boolean getSalvageArmor() { return config.getBoolean("Skills.Repair.Salvage_armor", true); }
/* Smelting */
public int getSmeltingXPCoal() { return config.getInt("Experience.Smelting.Coal", 10); }
public int getSmeltingXPRedstone() { return config.getInt("Experience.Smelting.Redstone", 15); }
public int getSmeltingXPIron() { return config.getInt("Experience.Smelting.Iron", 25); }
public int getSmeltingXPGold() { return config.getInt("Experience.Smelting.Gold", 35); }
public int getSmeltingXPDiamond() { return config.getInt("Experience.Smelting.Diamond", 75); }
public int getSmeltingXPLapis() { return config.getInt("Experience.Smelting.Lapis", 40); }
public int getSmeltingXPEmerald() { return config.getInt("Experience.Smelting.Emerald", 100); }
/* Taming */
public int getTamingXPWolf() { return config.getInt("Experience.Taming.Animal_Taming.Wolf", 250); }
public int getTamingXPOcelot() { return config.getInt("Experience.Taming.Animal_Taming.Ocelot", 500); }
@ -308,6 +317,10 @@ public class Config extends ConfigLoader {
return getLevelCap("Skills.Repair.Level_Cap");
}
public int getLevelCapSmelting() {
return getLevelCap("Skills.Smelting.Level_Cap");
}
public int getLevelCapSwords() {
return getLevelCap("Skills.Swords.Level_Cap");
}

View File

@ -5,6 +5,7 @@ import java.util.List;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -34,6 +35,7 @@ import com.gmail.nossr50.skills.herbalism.Herbalism;
import com.gmail.nossr50.skills.mining.MiningManager;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.repair.Salvage;
import com.gmail.nossr50.skills.smelting.SmeltingManager;
import com.gmail.nossr50.skills.woodcutting.Woodcutting;
import com.gmail.nossr50.spout.SpoutSounds;
import com.gmail.nossr50.util.BlockChecks;
@ -213,16 +215,30 @@ public class BlockListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreakHigher(BlockBreakEvent event) {
if (event instanceof FakeBlockBreakEvent) {
return;
}
Player player = event.getPlayer();
Block block = event.getBlock();
ItemStack inHand = player.getItemInHand();
if (Misc.isNPC(player)) {
return;
}
if (Permissions.hylianLuck(player) && ItemChecks.isSword(player.getItemInHand()) && !mcMMO.placeStore.isTrue(block)) {
if (mcMMO.placeStore.isTrue(block)) {
mcMMO.placeStore.setFalse(block);
return;
}
if (Permissions.hylianLuck(player) && ItemChecks.isSword(inHand)) {
Herbalism.hylianLuck(block, player, event);
}
else if (BlockChecks.canBeFluxMined(block) && ItemChecks.isPickaxe(inHand) && !inHand.containsEnchantment(Enchantment.SILK_TOUCH)) {
SmeltingManager smeltingManager = new SmeltingManager(player);
smeltingManager.fluxMining(event);
}
}
/**

View File

@ -0,0 +1,89 @@
package com.gmail.nossr50.listeners;
import org.bukkit.block.Block;
import org.bukkit.block.Furnace;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.FurnaceBurnEvent;
import org.bukkit.event.inventory.FurnaceExtractEvent;
import org.bukkit.event.inventory.FurnaceSmeltEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.FurnaceInventory;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.smelting.SmeltingManager;
import com.gmail.nossr50.util.ItemChecks;
public class InventoryListener implements Listener{
private final mcMMO plugin;
public InventoryListener(final mcMMO plugin) {
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.MONITOR)
public void onInventoryOpen(InventoryOpenEvent event) {
InventoryType inventoryType = event.getInventory().getType();
if (inventoryType == InventoryType.FURNACE) {
FurnaceInventory inventory = (FurnaceInventory) event.getInventory();
Furnace furnace = inventory.getHolder();
Block furnaceBlock = furnace.getBlock();
if (furnace.getBurnTime() == 0 && !plugin.furnaceIsTracked(furnaceBlock)) {
plugin.addToOpenFurnaceTracker(furnaceBlock, event.getPlayer().getName());
}
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onInventoryClose(InventoryCloseEvent event) {
InventoryType inventoryType = event.getInventory().getType();
if (inventoryType == InventoryType.FURNACE) {
FurnaceInventory inventory = (FurnaceInventory) event.getInventory();
Furnace furnace = inventory.getHolder();
Block furnaceBlock = furnace.getBlock();
if (furnace.getBurnTime() == 0 && plugin.furnaceIsTracked(furnaceBlock)) {
plugin.removeFromFurnaceTracker(furnaceBlock);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceBurnEvent(FurnaceBurnEvent event) {
Block furnaceBlock = event.getBlock();
FurnaceInventory inventory = ((Furnace)furnaceBlock).getInventory();
if (plugin.furnaceIsTracked(furnaceBlock) && ItemChecks.isSmeltable(inventory.getSmelting())) {
SmeltingManager smeltingManager = new SmeltingManager(plugin.getFurnacePlayer(furnaceBlock));
smeltingManager.fuelEfficiency(event);
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) {
Block furnaceBlock = event.getBlock();
FurnaceInventory inventory = ((Furnace)furnaceBlock).getInventory();
if (plugin.furnaceIsTracked(furnaceBlock) && ItemChecks.isSmeltable(inventory.getSmelting())) {
SmeltingManager smeltingManager = new SmeltingManager(plugin.getFurnacePlayer(furnaceBlock));
smeltingManager.smeltProcessing(event);
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceExtractEvent(FurnaceExtractEvent event) {
Block furnaceBlock = event.getBlock();
FurnaceInventory inventory = ((Furnace)furnaceBlock).getInventory();
if (plugin.furnaceIsTracked(furnaceBlock) && ItemChecks.isSmeltable(inventory.getSmelting())) {
SmeltingManager smeltingManager = new SmeltingManager(plugin.getFurnacePlayer(furnaceBlock));
smeltingManager.vanillaXPBoost(event);
}
}
}

View File

@ -235,7 +235,7 @@ public class PlayerListener implements Listener {
player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", new Object[] { 4 }) }));
}
if (Permissions.luckyAcrobatics(player) || Permissions.luckyArchery(player) || Permissions.luckyAxes(player) || Permissions.luckyFishing(player) || Permissions.luckyHerbalism(player) || Permissions.luckyMining(player) || Permissions.luckyRepair(player) || Permissions.luckySwords(player) || Permissions.luckyTaming(player) || Permissions.luckyUnarmed(player) || Permissions.luckyWoodcutting(player)) {
if (Permissions.luckyAcrobatics(player) || Permissions.luckyArchery(player) || Permissions.luckyAxes(player) || Permissions.luckyFishing(player) || Permissions.luckyHerbalism(player) || Permissions.luckyMining(player) || Permissions.luckyRepair(player) || Permissions.luckySwords(player) || Permissions.luckyTaming(player) || Permissions.luckyUnarmed(player) || Permissions.luckyWoodcutting(player) || Permissions.luckySmelting(player)) {
player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
}

View File

@ -9,6 +9,7 @@ import java.util.List;
import net.shatteredlands.shatt.backup.ZipLibrary;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
@ -43,6 +44,7 @@ import com.gmail.nossr50.datatypes.PlayerProfile;
import com.gmail.nossr50.listeners.BlockListener;
import com.gmail.nossr50.listeners.EntityListener;
import com.gmail.nossr50.listeners.HardcoreListener;
import com.gmail.nossr50.listeners.InventoryListener;
import com.gmail.nossr50.listeners.PlayerListener;
import com.gmail.nossr50.listeners.WorldListener;
import com.gmail.nossr50.locale.LocaleLoader;
@ -70,6 +72,7 @@ import com.gmail.nossr50.skills.repair.RepairManager;
import com.gmail.nossr50.skills.repair.RepairManagerFactory;
import com.gmail.nossr50.skills.repair.Repairable;
import com.gmail.nossr50.skills.repair.config.RepairConfigManager;
import com.gmail.nossr50.skills.smelting.SmeltingCommand;
import com.gmail.nossr50.skills.swords.SwordsCommand;
import com.gmail.nossr50.skills.taming.TamingCommand;
import com.gmail.nossr50.skills.unarmed.UnarmedCommand;
@ -86,16 +89,17 @@ import com.gmail.nossr50.util.Users;
import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager;
import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory;
public class mcMMO extends JavaPlugin {
private final PlayerListener playerListener = new PlayerListener(this);
private final BlockListener blockListener = new BlockListener(this);
private final EntityListener entityListener = new EntityListener(this);
private final WorldListener worldListener = new WorldListener();
private final HardcoreListener hardcoreListener = new HardcoreListener();
private final InventoryListener inventoryListener = new InventoryListener(this);
private HashMap<String, String> aliasMap = new HashMap<String, String>(); //Alias - Command
private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>();
private HashMap<Block, String> furnaceTracker = new HashMap<Block, String>();
private static Database database;
public static mcMMO p;
@ -165,6 +169,7 @@ public class mcMMO extends JavaPlugin {
pluginManager.registerEvents(blockListener, this);
pluginManager.registerEvents(entityListener, this);
pluginManager.registerEvents(worldListener, this);
pluginManager.registerEvents(inventoryListener, this);
if (configInstance.getHardcoreEnabled()) {
pluginManager.registerEvents(hardcoreListener, this);
@ -336,6 +341,7 @@ public class mcMMO extends JavaPlugin {
aliasMap.put(LocaleLoader.getString("Herbalism.SkillName").toLowerCase(), "herbalism");
aliasMap.put(LocaleLoader.getString("Mining.SkillName").toLowerCase(), "mining");
aliasMap.put(LocaleLoader.getString("Repair.SkillName").toLowerCase(), "repair");
aliasMap.put(LocaleLoader.getString("Acrobatics.SkillName").toLowerCase(), "smelting");
aliasMap.put(LocaleLoader.getString("Swords.SkillName").toLowerCase(), "swords");
aliasMap.put(LocaleLoader.getString("Taming.SkillName").toLowerCase(), "taming");
aliasMap.put(LocaleLoader.getString("Unarmed.SkillName").toLowerCase(), "unarmed");
@ -351,6 +357,7 @@ public class mcMMO extends JavaPlugin {
getCommand("herbalism").setExecutor(new HerbalismCommand());
getCommand("mining").setExecutor(new MiningCommand());
getCommand("repair").setExecutor(new RepairCommand());
getCommand("smelting").setExecutor(new SmeltingCommand());
getCommand("swords").setExecutor(new SwordsCommand());
getCommand("taming").setExecutor(new TamingCommand());
getCommand("unarmed").setExecutor(new UnarmedCommand());
@ -517,6 +524,22 @@ public class mcMMO extends JavaPlugin {
tntTracker.remove(tntID);
}
public void addToOpenFurnaceTracker(Block furnace, String playerName) {
furnaceTracker.put(furnace, playerName);
}
public boolean furnaceIsTracked(Block furnace) {
return furnaceTracker.containsKey(furnace);
}
public void removeFromFurnaceTracker(Block furnace) {
furnaceTracker.remove(furnace);
}
public Player getFurnacePlayer(Block furnace) {
return getServer().getPlayer(furnaceTracker.get(furnace));
}
public static String getMainDirectory() {
return mainDirectory;
}

View File

@ -60,8 +60,11 @@ public abstract class SkillCommand implements CommandExecutor {
permissionsCheck();
player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString(skillString + ".SkillName") }));
player.sendMessage(LocaleLoader.getString("Commands.XPGain", new Object[] { LocaleLoader.getString("Commands.XPGain." + skillString) }));
player.sendMessage(LocaleLoader.getString("Effects.Level", new Object[] { profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill) }));
if (!skill.isChildSkill()) {
player.sendMessage(LocaleLoader.getString("Commands.XPGain", new Object[] { LocaleLoader.getString("Commands.XPGain." + skillString) }));
player.sendMessage(LocaleLoader.getString("Effects.Level", new Object[] { profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill) }));
}
if (effectsHeaderPermissions()) {
player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Effects.Effects") }));

View File

@ -19,6 +19,13 @@ public abstract class SkillManager {
this.skillLevel = profile.getSkillLevel(skill);
this.activationChance = Misc.calculateActivationChance(Permissions.lucky(player, skill));
}
public SkillManager(Player player, SkillType child, SkillType parent1, SkillType parent2) {
this.player = player;
this.profile = Users.getProfile(player);
this.skillLevel = (profile.getSkillLevel(parent1) / 4) + (profile.getSkillLevel(parent2) / 4); //TODO: Make this cleaner somehow
this.activationChance = Misc.calculateActivationChance(Permissions.lucky(player, child));
}
public Player getPlayer() {
return player;

View File

@ -16,6 +16,7 @@ public enum SkillType {
HERBALISM(AbilityType.GREEN_TERRA, Config.getInstance().getLevelCapHerbalism(), ToolType.HOE, Config.getInstance().getFormulaMultiplierHerbalism()),
MINING(AbilityType.SUPER_BREAKER, Config.getInstance().getLevelCapMining(), ToolType.PICKAXE, Config.getInstance().getFormulaMultiplierMining()),
REPAIR(Config.getInstance().getLevelCapRepair(), Config.getInstance().getFormulaMultiplierRepair()),
SMELTING(Config.getInstance().getLevelCapSmelting(), 0),
SWORDS(AbilityType.SERRATED_STRIKES, Config.getInstance().getLevelCapSwords(), ToolType.SWORD, Config.getInstance().getFormulaMultiplierSwords()),
TAMING(Config.getInstance().getLevelCapTaming(), Config.getInstance().getFormulaMultiplierTaming()),
UNARMED(AbilityType.BERSERK, Config.getInstance().getLevelCapUnarmed(), ToolType.FISTS, Config.getInstance().getFormulaMultiplierUnarmed()),
@ -142,4 +143,14 @@ public enum SkillType {
public int getSkillLevel(Player player) {
return Users.getProfile(player).getSkillLevel(this);
}
public boolean isChildSkill() {
switch (this) {
case SMELTING:
return true;
default:
return false;
}
}
}

View File

@ -580,6 +580,8 @@ public class Herbalism {
else {
item = new ItemStack(Material.APPLE);
}
mcMMO.placeStore.setFalse(block);
break;
case FLOWER_POT:

View File

@ -96,7 +96,7 @@ public class Mining {
case EMERALD_ORE:
xp += config.getMiningXPEmeraldOre();
break;
default:
if (ModChecks.isCustomMiningBlock(block)) {
xp += ModChecks.getCustomBlock(block).getXpGain();

View File

@ -0,0 +1,59 @@
package com.gmail.nossr50.skills.smelting;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillType;
import com.gmail.nossr50.skills.mining.Mining;
import com.gmail.nossr50.util.Misc;
public class FluxMiningEventHandler {
private SmeltingManager manager;
private BlockBreakEvent event;
private Block block;
protected FluxMiningEventHandler(SmeltingManager manager, BlockBreakEvent event) {
this.manager = manager;
this.event = event;
this.block = event.getBlock();
}
protected void processDrops() {
ItemStack item = null;
switch (block.getType()) {
case IRON_ORE:
item = new ItemStack(Material.IRON_INGOT);
break;
case GOLD_ORE:
item = new ItemStack(Material.GOLD_INGOT);
break;
default:
break;
}
if (item == null) {
return;
}
Location location = block.getLocation();
int chance = (int) ((Mining.doubleDropsMaxChance / Mining.doubleDropsMaxLevel) * (Misc.skillCheck(manager.getProfile().getSkillLevel(SkillType.MINING), Mining.doubleDropsMaxLevel)));
Misc.dropItem(location, item);
Misc.randomDropItem(location, item, chance);
}
protected void eventCancellationAndProcessing() {
event.setCancelled(true);
block.setType(Material.AIR);
}
protected void sendAbilityMessage() {
manager.getPlayer().sendMessage(LocaleLoader.getString("Smelting.FluxMining.Success"));
}
}

View File

@ -0,0 +1,23 @@
package com.gmail.nossr50.skills.smelting;
import org.bukkit.event.inventory.FurnaceBurnEvent;
public class FuelEfficiencyEventHandler {
private SmeltingManager manager;
private FurnaceBurnEvent event;
private double burnModifier;
protected FuelEfficiencyEventHandler(SmeltingManager manager, FurnaceBurnEvent event) {
this.manager = manager;
this.event = event;
}
protected void calculateBurnModifier() {
this.burnModifier = 1 + ((manager.getSkillLevel() / Smelting.burnModifierMaxLevel) * Smelting.burnTimeMultiplier);
}
protected void modifyBurnTime() {
int burnTime = event.getBurnTime();
event.setBurnTime((int)(burnTime * burnModifier));
}
}

View File

@ -0,0 +1,79 @@
package com.gmail.nossr50.skills.smelting;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.FurnaceSmeltEvent;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.PlayerProfile;
import com.gmail.nossr50.skills.SkillType;
import com.gmail.nossr50.skills.Skills;
import com.gmail.nossr50.util.Misc;
public class SmeltResourceEventHandler {
private SmeltingManager manager;
private FurnaceSmeltEvent event;
protected int skillModifier;
protected SmeltResourceEventHandler(SmeltingManager manager, FurnaceSmeltEvent event) {
this.manager = manager;
this.event = event;
}
protected void calculateSkillModifier() {
this.skillModifier = Misc.skillCheck(manager.getSkillLevel(), Smelting.secondSmeltMaxLevel);
}
protected void handleXPGain() {
Player player = manager.getPlayer();
PlayerProfile profile = manager.getProfile();
Material sourceType = event.getSource().getType();
int xp = 0;
switch (sourceType) {
case COAL_ORE:
xp = Config.getInstance().getSmeltingXPCoal();
break;
case GLOWING_REDSTONE_ORE:
case REDSTONE_ORE:
xp = Config.getInstance().getSmeltingXPRedstone();
break;
case IRON_ORE:
xp = Config.getInstance().getSmeltingXPIron();
break;
case GOLD_ORE:
xp = Config.getInstance().getSmeltingXPGold();
break;
case DIAMOND_ORE:
xp = Config.getInstance().getSmeltingXPDiamond();
break;
case LAPIS_ORE:
xp = Config.getInstance().getSmeltingXPLapis();
break;
case EMERALD_ORE:
xp = Config.getInstance().getSmeltingXPEmerald();
break;
default:
break;
}
Skills.xpProcessing(player, profile, SkillType.MINING, xp / 2);
Skills.xpProcessing(player, profile, SkillType.REPAIR, xp / 2);
}
protected void handleBonusSmelts() {
ItemStack result = event.getResult();
result.setAmount(result.getAmount() + 1);
event.setResult(result);
}
}

View File

@ -0,0 +1,18 @@
package com.gmail.nossr50.skills.smelting;
public class Smelting {
public static int burnModifierMaxLevel = 1000;
public static double burnTimeMultiplier = 3.0;
public static double secondSmeltMaxChance = 100;
public static int secondSmeltMaxLevel = 1000;
public static int fluxMiningUnlockLevel = 200;
public static double fluxMiningChance = 33.0;
public static int vanillaXPBoostRank1Level = 100;
public static int vanillaXPBoostRank2Level = 300;
public static int vanillaXPBoostRank3Level = 500;
public static int vanillaXPBoostRank4Level = 700;
public static int vanillaXPBoostRank5Level = 900;
}

View File

@ -0,0 +1,134 @@
package com.gmail.nossr50.skills.smelting;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.SkillCommand;
import com.gmail.nossr50.skills.SkillType;
import com.gmail.nossr50.util.Permissions;
public class SmeltingCommand extends SkillCommand {
private String burnTimeModifier;
private String secondSmeltChance;
private String secondSmeltChanceLucky;
private String fluxMiningChance;
private String fluxMiningChanceLucky;
private String vanillaXPModifier;
private boolean canFuelEfficiency;
private boolean canSecondSmelt;
private boolean canFluxMine;
private boolean canVanillaXPBoost;
public SmeltingCommand() {
super(SkillType.SMELTING);
this.skillValue = (profile.getSkillLevel(SkillType.MINING) / 4) + (profile.getSkillLevel(SkillType.REPAIR) / 4); //TODO: Make this cleaner somehow
}
@Override
protected void dataCalculations() {
//FUEL EFFICIENCY
burnTimeModifier = String.valueOf(1 + ((skillValue / Smelting.burnModifierMaxLevel) * Smelting.burnTimeMultiplier));
//SECOND SMELT
String[] secondSmeltStrings = calculateAbilityDisplayValues(Smelting.secondSmeltMaxLevel, Smelting.secondSmeltMaxChance);
secondSmeltChance = secondSmeltStrings[0];
secondSmeltChanceLucky = secondSmeltStrings[1];
//FLUX MINING
String[] fluxMiningStrings = calculateAbilityDisplayValues(Smelting.fluxMiningChance);
fluxMiningChance = fluxMiningStrings[0];
fluxMiningChanceLucky = fluxMiningStrings[1];
//VANILLA XP BOOST
if (skillValue >= Smelting.vanillaXPBoostRank5Level) {
vanillaXPModifier = "6";
}
else if (skillValue >= Smelting.vanillaXPBoostRank4Level) {
vanillaXPModifier = "5";
}
else if (skillValue >= Smelting.vanillaXPBoostRank3Level) {
vanillaXPModifier = "4";
}
else if (skillValue >= Smelting.vanillaXPBoostRank2Level) {
vanillaXPModifier = "3";
}
else {
vanillaXPModifier = "2";
}
}
@Override
protected void permissionsCheck() {
canFuelEfficiency = Permissions.fuelEfficiency(player);
canSecondSmelt = Permissions.secondSmelt(player);
canFluxMine = Permissions.fluxMining(player);
canVanillaXPBoost = Permissions.smeltingVanillaXPBoost(player);
}
@Override
protected boolean effectsHeaderPermissions() {
return canFluxMine || canFuelEfficiency || canSecondSmelt || canVanillaXPBoost;
}
@Override
protected void effectsDisplay() {
luckyEffectsDisplay();
if (canFuelEfficiency) {
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Smelting.Effect.0"), LocaleLoader.getString("Smelting.Effect.1") }));
}
if (canSecondSmelt) {
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Smelting.Effect.2"), LocaleLoader.getString("Smelting.Effect.3") }));
}
if (canVanillaXPBoost) {
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Smelting.Effect.4"), LocaleLoader.getString("Smelting.Effect.5") }));
}
if (canFluxMine) {
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Smelting.Effect.6"), LocaleLoader.getString("Smelting.Effect.7") }));
}
}
@Override
protected boolean statsHeaderPermissions() {
return canFluxMine || canFuelEfficiency || canSecondSmelt || canVanillaXPBoost;
}
@Override
protected void statsDisplay() {
if (canFuelEfficiency) {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.FuelEfficiency", new Object[] { burnTimeModifier }));
}
if (canSecondSmelt) {
if (isLucky) {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.SecondSmelt", new Object[] { secondSmeltChance }) + LocaleLoader.getString("Perks.lucky.bonus", new Object[] { secondSmeltChanceLucky }));
}
else {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.SecondSmelt", new Object[] { secondSmeltChance }));
}
}
if (canVanillaXPBoost) {
if (skillValue < Smelting.vanillaXPBoostRank1Level) {
player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", new Object[] { LocaleLoader.getString("Smelting.Ability.Locked.0", new Object[] { Smelting.vanillaXPBoostRank1Level } ) }));
}
else {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.VanillaXPBoost", new Object[] { vanillaXPModifier }));
}
}
if (canFluxMine) {
if (skillValue < Smelting.fluxMiningUnlockLevel) {
player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", new Object[] { LocaleLoader.getString("Smelting.Ability.Locked.1", new Object[] { Smelting.fluxMiningUnlockLevel } ) }));
}
else if (isLucky) {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.FluxMining", new Object[] { fluxMiningChance }) + LocaleLoader.getString("Perks.lucky.bonus", new Object[] { fluxMiningChanceLucky }));
}
else {
player.sendMessage(LocaleLoader.getString("Smelting.Ability.FluxMining", new Object[] { fluxMiningChance }));
}
}
}
}

View File

@ -0,0 +1,80 @@
package com.gmail.nossr50.skills.smelting;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.inventory.FurnaceBurnEvent;
import org.bukkit.event.inventory.FurnaceExtractEvent;
import org.bukkit.event.inventory.FurnaceSmeltEvent;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.SkillType;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
public class SmeltingManager extends SkillManager {
public SmeltingManager(Player player) {
super(player, SkillType.SMELTING);
}
/**
* Increases burn time for furnace fuel.
*
* @param event The {@link FurnaceBurnEvent} to modify.
*/
public void fuelEfficiency(FurnaceBurnEvent event) {
if (Misc.isNPC(player) || !Permissions.fuelEfficiency(player)) {
return;
}
FuelEfficiencyEventHandler eventHandler = new FuelEfficiencyEventHandler(this, event);
eventHandler.calculateBurnModifier();
eventHandler.modifyBurnTime();
}
public void smeltProcessing(FurnaceSmeltEvent event) {
if (Misc.isNPC(player)) {
return;
}
SmeltResourceEventHandler eventHandler = new SmeltResourceEventHandler(this, event);
if (Permissions.smelting(player)) {
eventHandler.handleXPGain();
}
if (!Permissions.secondSmelt(player)) {
return;
}
eventHandler.calculateSkillModifier();
double chance = (Smelting.secondSmeltMaxChance / Smelting.secondSmeltMaxLevel) * eventHandler.skillModifier;
if (chance > Misc.getRandom().nextInt(activationChance)) {
eventHandler.handleBonusSmelts();
}
}
public void fluxMining(BlockBreakEvent event) {
if (skillLevel < Smelting.fluxMiningUnlockLevel || !Permissions.fluxMining(player)) {
return;
}
if (Smelting.fluxMiningChance > Misc.getRandom().nextInt(activationChance)) {
FluxMiningEventHandler eventHandler = new FluxMiningEventHandler(this, event);
eventHandler.processDrops();
eventHandler.eventCancellationAndProcessing();
eventHandler.sendAbilityMessage();
}
}
public void vanillaXPBoost(FurnaceExtractEvent event) {
if (skillLevel < Smelting.vanillaXPBoostRank1Level || !Permissions.smeltingVanillaXPBoost(player)) {
return;
}
SmeltingVanillaXPEventHandler eventHandler = new SmeltingVanillaXPEventHandler(this, event);
eventHandler.calculateModifier();
eventHandler.modifyVanillaXP();
}
}

View File

@ -0,0 +1,39 @@
package com.gmail.nossr50.skills.smelting;
import org.bukkit.event.inventory.FurnaceExtractEvent;
public class SmeltingVanillaXPEventHandler {
private SmeltingManager manager;
private FurnaceExtractEvent event;
private int xpBoostModifier;
protected SmeltingVanillaXPEventHandler(SmeltingManager manager, FurnaceExtractEvent event) {
this.manager = manager;
this.event = event;
}
protected void calculateModifier() {
int skillLevel = manager.getSkillLevel();
if (skillLevel >= Smelting.vanillaXPBoostRank5Level) {
xpBoostModifier = 6;
}
else if (skillLevel >= Smelting.vanillaXPBoostRank4Level) {
xpBoostModifier = 5;
}
else if (skillLevel >= Smelting.vanillaXPBoostRank3Level) {
xpBoostModifier = 4;
}
else if (skillLevel >= Smelting.vanillaXPBoostRank2Level) {
xpBoostModifier = 3;
}
else {
xpBoostModifier = 2;
}
}
protected void modifyVanillaXP() {
int xp = event.getExpToDrop();
event.setExpToDrop(xp * xpBoostModifier);
}
}

View File

@ -303,4 +303,15 @@ public class BlockChecks {
return false;
}
public static boolean canBeFluxMined(Block block) {
switch (block.getType()) {
case IRON_ORE:
case GOLD_ORE:
return true;
default:
return false;
}
}
}

View File

@ -473,4 +473,21 @@ public class ItemChecks {
type == Material.SHEARS || type == Material.FISHING_ROD || type == Material.CARROT_STICK ||
type == Material.FLINT_AND_STEEL || type == Material.BOW;
}
public static boolean isSmeltable(ItemStack itemStack) {
switch (itemStack.getType()) {
case COAL_ORE:
case DIAMOND_ORE:
case GLOWING_REDSTONE_ORE:
case GOLD_ORE:
case IRON_ORE:
case LAPIS_ORE:
case REDSTONE_ORE:
case EMERALD_ORE:
return true;
default:
return false;
}
}
}

View File

@ -113,6 +113,10 @@ public class Permissions {
return hasPermission(player, "mcmmo.perks.lucky.repair");
}
public static boolean luckySmelting(Player player) {
return hasPermission(player, "mcmmo.perks.lucky.smelting");
}
public static boolean luckySwords(Player player) {
return hasPermission(player, "mcmmo.perks.lucky.swords");
}
@ -502,6 +506,26 @@ public class Permissions {
return hasPermission(player, "mcmmo.ability.blastmining.detonate");
}
/*
* MCMMO.ABILITY.SMELTING.*
*/
public static boolean fuelEfficiency(Player player) {
return hasPermission(player, "mcmmo.ability.smelting.fuelefficiency");
}
public static boolean secondSmelt(Player player) {
return hasPermission(player, "mcmmo.ability.smelting.secondsmelt");
}
public static boolean fluxMining(Player player) {
return hasPermission(player, "mcmmo.ability.smelting.fluxmining");
}
public static boolean smeltingVanillaXPBoost(Player player) {
return hasPermission(player, "mcmmo.ability.smelting.vanillaxpboost");
}
/*
* MCMMO.ITEM.*
*/
@ -602,4 +626,8 @@ public class Permissions {
public static boolean acrobatics(Player player) {
return hasPermission(player, "mcmmo.skills.acrobatics");
}
public static boolean smelting(Player player) {
return hasPermission(player, "mcmmo.skills.smelting");
}
}