diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 10603f4f..e7673d1b 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -40,6 +40,7 @@ import net.Indyuce.mmocore.comp.holograms.CMIPlugin; import net.Indyuce.mmocore.comp.holograms.HologramSupport; import net.Indyuce.mmocore.comp.holograms.HologramsPlugin; import net.Indyuce.mmocore.comp.holograms.HolographicDisplaysPlugin; +import net.Indyuce.mmocore.comp.mmoitems.MMOItemsMMOLoader; import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsDrops; import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsMMOLoader; import net.Indyuce.mmocore.comp.placeholder.DefaultParser; @@ -146,6 +147,9 @@ public class MMOCore extends JavaPlugin { /* * register extra objective, drop items... */ + if (Bukkit.getPluginManager().getPlugin("MMOItems") != null) + loadManager.registerLoader(new MMOItemsMMOLoader()); + if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) loadManager.registerLoader(new WorldGuardMMOLoader()); diff --git a/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java b/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java new file mode 100644 index 00000000..5566f49e --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/experience/source/MineMIBlockExperienceSource.java @@ -0,0 +1,66 @@ +package net.Indyuce.mmocore.api.experience.source; + +import org.bukkit.GameMode; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; + +import net.Indyuce.mmocore.api.experience.Profession; +import net.Indyuce.mmocore.api.experience.source.type.SpecificExperienceSource; +import net.Indyuce.mmocore.api.load.MMOLineConfig; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.manager.profession.ExperienceManager; +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.CustomBlock; + +public class MineMIBlockExperienceSource extends SpecificExperienceSource { + public final int id; + private final boolean silkTouch; + private final boolean playerPlaced; + + public MineMIBlockExperienceSource(Profession profession, MMOLineConfig config) { + super(profession, config); + + config.validate("id"); + id = config.getInt("id", 1); + silkTouch = config.getBoolean("silk-touch", true); + playerPlaced = config.getBoolean("player-placed", false); + } + + @Override + public ExperienceManager newManager() { + return new ExperienceManager() { + + @EventHandler(priority = EventPriority.HIGHEST) + public void a(BlockBreakEvent event) { + if (event.isCancelled() || event.getPlayer().getGameMode() != GameMode.SURVIVAL) + return; + PlayerData data = PlayerData.get(event.getPlayer()); + + for (MineMIBlockExperienceSource source : getSources()) + { + if (!MMOItems.plugin.getCustomBlocks().isMushroomBlock(event.getBlock().getType())) + continue; + if (source.silkTouch && hasSilkTouch(event.getPlayer().getInventory().getItemInMainHand())) + continue; + if ((!source.playerPlaced) && event.getBlock().hasMetadata("player_placed")) + continue; + + if (source.matches(data, CustomBlock.getFromData(event.getBlock().getBlockData()).getId())) + source.giveExperience(data, event.getBlock().getLocation()); + } + } + }; + } + + private boolean hasSilkTouch(ItemStack item) { + return item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.SILK_TOUCH); + } + + @Override + public boolean matches(PlayerData player, Integer blockId) { + return id == blockId && hasRightClass(player); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java index c1f17d40..8d730b3c 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -132,7 +132,7 @@ public class DefaultMMOLoader implements MMOLoader { if (config.getKey().equals("repairitem")) return new RepairItemExperienceSource(profession, config); - + return null; } } diff --git a/src/main/java/net/Indyuce/mmocore/api/load/MMOLineConfig.java b/src/main/java/net/Indyuce/mmocore/api/load/MMOLineConfig.java index 41d59a08..0daf86d6 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/MMOLineConfig.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/MMOLineConfig.java @@ -64,6 +64,10 @@ public class MMOLineConfig { return json.get(path).getAsInt(); } + public int getInt(String path, int def) { + return json.has(path) ? getInt(path) : def; + } + public long getLong(String path) { return json.get(path).getAsLong(); } diff --git a/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java b/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java new file mode 100644 index 00000000..030097c3 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/comp/mmoitems/MMOItemsMMOLoader.java @@ -0,0 +1,44 @@ +package net.Indyuce.mmocore.comp.mmoitems; + +import org.bukkit.configuration.ConfigurationSection; + +import net.Indyuce.mmocore.api.droptable.condition.Condition; +import net.Indyuce.mmocore.api.droptable.dropitem.DropItem; +import net.Indyuce.mmocore.api.experience.Profession; +import net.Indyuce.mmocore.api.experience.source.MineBlockExperienceSource; +import net.Indyuce.mmocore.api.experience.source.type.ExperienceSource; +import net.Indyuce.mmocore.api.load.MMOLineConfig; +import net.Indyuce.mmocore.api.load.MMOLoader; +import net.Indyuce.mmocore.api.quest.objective.Objective; +import net.Indyuce.mmocore.api.quest.trigger.Trigger; + +public class MMOItemsMMOLoader implements MMOLoader { + + @Override + public Condition loadCondition(MMOLineConfig config) { + return null; + } + + @Override + public Trigger loadTrigger(MMOLineConfig config) { + return null; + } + + @Override + public DropItem loadDropItem(MMOLineConfig config) { + return null; + } + + @Override + public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { + return null; + } + + @Override + public ExperienceSource loadExperienceSource(MMOLineConfig config, Profession profession) { + if (config.getKey().equals("minemiblock")) + return new MineBlockExperienceSource(profession, config); + + return null; + } +}