From 2411dae63177efcf2e902e46d85ab8c4b45b1123 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 8 May 2022 11:14:58 +0200 Subject: [PATCH] Debug for all the experience source. Added VanillaExperience & Resource ExperienceSource and added inCombat for Playing Experience Source. --- .../mmocore/api/load/DefaultMMOLoader.java | 219 ++++++++++-------- .../ProfessionExperienceDispenser.java | 2 +- .../source/ClimbExperienceSource.java | 35 +-- .../source/DamageDealtExperienceSource.java | 6 +- .../source/DamageTakenExperienceSource.java | 30 ++- .../source/MoveExperienceSource.java | 20 +- ...eSource.java => PlayExperienceSource.java} | 24 +- .../source/ProjectileExperienceSource.java | 42 ++-- .../source/ResourceExperienceSource.java | 63 +++++ .../source/RideExperienceSource.java | 7 +- ...eSource.java => TameExperienceSource.java} | 13 +- .../VanillaExperienceExperienceSource.java | 39 ++++ .../source/type/SpecificExperienceSource.java | 4 + 13 files changed, 332 insertions(+), 172 deletions(-) rename src/main/java/net/Indyuce/mmocore/experience/source/{PlayingExperienceSource.java => PlayExperienceSource.java} (78%) create mode 100644 src/main/java/net/Indyuce/mmocore/experience/source/ResourceExperienceSource.java rename src/main/java/net/Indyuce/mmocore/experience/source/{TamingExperienceSource.java => TameExperienceSource.java} (75%) create mode 100644 src/main/java/net/Indyuce/mmocore/experience/source/VanillaExperienceExperienceSource.java 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 074b123d..970c2c09 100644 --- a/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java +++ b/src/main/java/net/Indyuce/mmocore/api/load/DefaultMMOLoader.java @@ -1,6 +1,7 @@ package net.Indyuce.mmocore.api.load; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.source.*; import net.Indyuce.mmocore.loot.droptable.condition.*; import org.bukkit.configuration.ConfigurationSection; @@ -12,15 +13,6 @@ import net.Indyuce.mmocore.loot.droptable.dropitem.DropTableDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.GoldDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.NoteDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.VanillaDropItem; -import net.Indyuce.mmocore.experience.source.BrewPotionExperienceSource; -import net.Indyuce.mmocore.experience.source.CraftItemExperienceSource; -import net.Indyuce.mmocore.experience.source.EnchantItemExperienceSource; -import net.Indyuce.mmocore.experience.source.FishItemExperienceSource; -import net.Indyuce.mmocore.experience.source.KillMobExperienceSource; -import net.Indyuce.mmocore.experience.source.MineBlockExperienceSource; -import net.Indyuce.mmocore.experience.source.PlaceBlockExperienceSource; -import net.Indyuce.mmocore.experience.source.RepairItemExperienceSource; -import net.Indyuce.mmocore.experience.source.SmeltItemExperienceSource; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.api.quest.objective.ClickonObjective; import net.Indyuce.mmocore.api.quest.objective.GoToObjective; @@ -40,130 +32,157 @@ import io.lumine.mythic.lib.api.MMOLineConfig; public class DefaultMMOLoader extends MMOLoader { - @Override - public Trigger loadTrigger(MMOLineConfig config) { - if (config.getKey().equals("message")) - return new MessageTrigger(config); + @Override + public Trigger loadTrigger(MMOLineConfig config) { + if (config.getKey().equals("message")) + return new MessageTrigger(config); - if (config.getKey().equals("sound") || config.getKey().equals("playsound")) - return new SoundTrigger(config); + if (config.getKey().equals("sound") || config.getKey().equals("playsound")) + return new SoundTrigger(config); - if (config.getKey().equals("mana")) - return new ManaTrigger(config); + if (config.getKey().equals("mana")) + return new ManaTrigger(config); - if (config.getKey().equals("stamina")) - return new StaminaTrigger(config); - - if (config.getKey().equals("stellium")) - return new StelliumTrigger(config); + if (config.getKey().equals("stamina")) + return new StaminaTrigger(config); - if (config.getKey().equals("command")) - return new CommandTrigger(config); + if (config.getKey().equals("stellium")) + return new StelliumTrigger(config); - if (config.getKey().equals("item") || config.getKey().equals("vanilla")) - return new ItemTrigger(config); + if (config.getKey().equals("command")) + return new CommandTrigger(config); - if (config.getKey().equals("exp") || config.getKey().equals("experience")) - return new ExperienceTrigger(config); + if (config.getKey().equals("item") || config.getKey().equals("vanilla")) + return new ItemTrigger(config); - return null; - } + if (config.getKey().equals("exp") || config.getKey().equals("experience")) + return new ExperienceTrigger(config); - @Override - public DropItem loadDropItem(MMOLineConfig config) { - if (config.getKey().equals("droptable")) - return new DropTableDropItem(config); + return null; + } - if (config.getKey().equals("vanilla")) - return new VanillaDropItem(config); + @Override + public DropItem loadDropItem(MMOLineConfig config) { + if (config.getKey().equals("droptable")) + return new DropTableDropItem(config); - if (config.getKey().equals("note")) - return new NoteDropItem(config); + if (config.getKey().equals("vanilla")) + return new VanillaDropItem(config); - if (config.getKey().equals("gold") || config.getKey().equals("coin")) - return new GoldDropItem(config); + if (config.getKey().equals("note")) + return new NoteDropItem(config); - return null; - } + if (config.getKey().equals("gold") || config.getKey().equals("coin")) + return new GoldDropItem(config); - @Override - public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { - if (config.getKey().equals("goto")) - return new GoToObjective(section, config); + return null; + } - if (config.getKey().equals("mineblock")) - return new MineBlockObjective(section, config); + @Override + public Objective loadObjective(MMOLineConfig config, ConfigurationSection section) { + if (config.getKey().equals("goto")) + return new GoToObjective(section, config); - if (config.getKey().equals("killmob")) - return new KillMobObjective(section, config); + if (config.getKey().equals("mineblock")) + return new MineBlockObjective(section, config); - if (config.getKey().equals("clickon")) - return new ClickonObjective(section, config); + if (config.getKey().equals("killmob")) + return new KillMobObjective(section, config); - return null; - } + if (config.getKey().equals("clickon")) + return new ClickonObjective(section, config); - @Override - public Condition loadCondition(MMOLineConfig config) { - if(config.getKey().equals("distance")) - return new DistanceCondition(config); + return null; + } - if (config.getKey().equals("world")) - return new WorldCondition(config); + @Override + public Condition loadCondition(MMOLineConfig config) { + if (config.getKey().equals("distance")) + return new DistanceCondition(config); - if (config.getKey().equals("biome")) - return new BiomeCondition(config); + if (config.getKey().equals("world")) + return new WorldCondition(config); - if (config.getKey().equals("level")) - return new LevelCondition(config); - - if (config.getKey().equals("permission")) - return new PermissionCondition(config); + if (config.getKey().equals("biome")) + return new BiomeCondition(config); - return null; - } + if (config.getKey().equals("level")) + return new LevelCondition(config); - @Override - public ExperienceSource loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { - if (config.getKey().equals("fishitem")) - return new FishItemExperienceSource(dispenser, config); + if (config.getKey().equals("permission")) + return new PermissionCondition(config); - if (config.getKey().equals("killmob")) - return new KillMobExperienceSource(dispenser, config); + return null; + } - if (config.getKey().equals("mineblock")) - return new MineBlockExperienceSource(dispenser, config); + @Override + public ExperienceSource loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { + if (config.getKey().equals("resource")) + return new ResourceExperienceSource(dispenser, config); - if (config.getKey().equals("placeblock")) - return new PlaceBlockExperienceSource(dispenser, config); + if (config.getKey().equals("vanillaexperience")) + return new VanillaExperienceExperienceSource(dispenser, config); - if (config.getKey().equals("brewpotion")) - return new BrewPotionExperienceSource(dispenser, config); + if (config.getKey().equals("climb")) + return new ClimbExperienceSource(dispenser, config); - if (config.getKey().equals("smeltitem")) - return new SmeltItemExperienceSource(dispenser, config); + if (config.getKey().equals("damagedealt")) + return new DamageDealtExperienceSource(dispenser, config); - if (config.getKey().equals("enchantitem")) - return new EnchantItemExperienceSource(dispenser, config); + if (config.getKey().equals("damagetaken")) + return new DamageTakenExperienceSource(dispenser, config); - if (config.getKey().equals("repairitem")) - return new RepairItemExperienceSource(dispenser, config); + if (config.getKey().equals("move")) + return new MoveExperienceSource(dispenser, config); - if (config.getKey().equals("craftitem")) - return new CraftItemExperienceSource(dispenser, config); + if (config.getKey().equals("play")) + return new PlayExperienceSource(dispenser, config); - return null; - } + if (config.getKey().equals("projectile")) + return new ProjectileExperienceSource(dispenser, config); - @Override - public BlockType loadBlockType(MMOLineConfig config) { + if (config.getKey().equals("ride")) + return new RideExperienceSource(dispenser, config); - if (config.getKey().equalsIgnoreCase("vanilla")) - return new VanillaBlockType(config); - - if (config.getKey().equalsIgnoreCase("skull") || config.getKey().equals("head") || config.getKey().equals("playerhead")) - return new SkullBlockType(config); + if (config.getKey().equals("tame")) + return new TameExperienceSource(dispenser, config); - return null; - } + if (config.getKey().equals("killmob")) + return new KillMobExperienceSource(dispenser, config); + + if (config.getKey().equals("mineblock")) + return new MineBlockExperienceSource(dispenser, config); + + if (config.getKey().equals("placeblock")) + return new PlaceBlockExperienceSource(dispenser, config); + + if (config.getKey().equals("brewpotion")) + return new BrewPotionExperienceSource(dispenser, config); + + if (config.getKey().equals("smeltitem")) + return new SmeltItemExperienceSource(dispenser, config); + + if (config.getKey().equals("enchantitem")) + return new EnchantItemExperienceSource(dispenser, config); + + if (config.getKey().equals("repairitem")) + return new RepairItemExperienceSource(dispenser, config); + + if (config.getKey().equals("craftitem")) + return new CraftItemExperienceSource(dispenser, config); + + return null; + } + + @Override + public BlockType loadBlockType(MMOLineConfig config) { + + if (config.getKey().equalsIgnoreCase("vanilla")) + return new VanillaBlockType(config); + + if (config.getKey().equalsIgnoreCase("skull") || config.getKey().equals("head") || config.getKey().equals("playerhead")) + return new SkullBlockType(config); + + return null; + } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java index af385fc1..273a05b2 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java +++ b/src/main/java/net/Indyuce/mmocore/experience/dispenser/ProfessionExperienceDispenser.java @@ -16,7 +16,7 @@ public class ProfessionExperienceDispenser implements ExperienceDispenser { @Override public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { hologramLocation = !profession.getOption(Profession.ProfessionOption.EXP_HOLOGRAMS) ? null - : hologramLocation == null ? getPlayerLocation(playerData) : hologramLocation; + : hologramLocation; playerData.getCollectionSkills().giveExperience(profession, experience, EXPSource.SOURCE, hologramLocation); } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/ClimbExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/ClimbExperienceSource.java index 4ae857b1..5e0c79c6 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/ClimbExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/ClimbExperienceSource.java @@ -6,16 +6,18 @@ import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.util.Vector; public class ClimbExperienceSource extends SpecificExperienceSource { //Can be Ladder,Vines,Twisting Vines,Weeping Vines. private final Material type; /** - *Gives Experience when a player climbs on a ladder, a vine, a twisting vine or a weeping vine depending + * Gives Experience when a player climbs on a ladder, a vine, a twisting vine or a weeping vine depending * on the type precised (if no type is precised it will give xp for the 4) * The xp given depends on the vertical distance travelled, the random amount given correspond * to the xp when you climb, one block @@ -27,9 +29,10 @@ public class ClimbExperienceSource extends SpecificExperienceSource { type = null; else { String str = config.getString("type").toUpperCase().replace("-", "_"); - Validate.isTrue(str.equals("ladder") || - str.equals("vines") || str.equals("twisting-vines") || str.equals("weeping-vines"), - "The type must be ladder, vine, twisted-vines or weeping-vines"); + Validate.isTrue(str.equals("LADDER") || + str.equals("VINE") || str.equals("TWISTING_VINES_PLANT") || str.equals("WEEPING_VINES"), + "ClimbExperienceSource problem: The type must be ladder, vine, twisted-vines or weeping-vines"); + type = Material.valueOf(str); } @@ -42,14 +45,14 @@ public class ClimbExperienceSource extends SpecificExperienceSource { return new ExperienceSourceManager() { @EventHandler public void onClimb(PlayerMoveEvent e) { - if(e.getPlayer().hasMetadata("NPC")) + if (e.getPlayer().hasMetadata("NPC")) return; - PlayerData playerData=PlayerData.get(e.getPlayer()); - double delta=e.getTo().getY()-e.getFrom().getY(); - if(delta>0) { - for(ClimbExperienceSource source:getSources()) { - if(source.matchesParameter(playerData,e.getTo().getBlock().getType())) - source.giveExperience(playerData,delta,null); + PlayerData playerData = PlayerData.get(e.getPlayer()); + double delta = e.getTo().getY() - e.getFrom().getY(); + if (delta > 0) { + for (ClimbExperienceSource source : getSources()) { + if (source.matchesParameter(playerData, e.getFrom().getBlock().getType())) + source.giveExperience(playerData, delta, null); } } } @@ -60,7 +63,13 @@ public class ClimbExperienceSource extends SpecificExperienceSource { public boolean matchesParameter(PlayerData player, Material material) { if (type == null) return material.equals(Material.LADDER) || material.equals(Material.VINE) || - material.equals(Material.WEEPING_VINES) || material.equals(Material.TWISTING_VINES); - return type.equals(material); + material.equals(Material.WEEPING_VINES) || material.equals(Material.TWISTING_VINES) || + material.equals(Material.WEEPING_VINES_PLANT) || material.equals(Material.TWISTING_VINES_PLANT); + if (type.equals(Material.WEEPING_VINES)) + return material.equals(Material.WEEPING_VINES) || material.equals(Material.WEEPING_VINES_PLANT); + if (type.equals(Material.TWISTING_VINES)) + return material.equals(Material.TWISTING_VINES) || material.equals(Material.TWISTING_VINES_PLANT); + return material.equals(type); + } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/DamageDealtExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/DamageDealtExperienceSource.java index b87dd880..8ebd1363 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/DamageDealtExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/DamageDealtExperienceSource.java @@ -26,13 +26,13 @@ public class DamageDealtExperienceSource extends SpecificExperienceSource !p.isSneaking() && !p.isSprinting() && !p.isFlying() && !p.isSwimming()); + SNEAK(Player::isSneaking), + FLY((p)->p.isFlying()||p.isGliding()), + SWIM((p)->p.getLocation().getBlock().isLiquid()), + SPRINT(Player::isSprinting), + WALK((p) -> !p.isSneaking() && !p.isSprinting() && !p.isFlying() && !p.getLocation().getBlock().isLiquid()); private final Function matching; @@ -73,7 +75,7 @@ public class MoveExperienceSource extends SpecificExperienceSource { } public boolean matches(Player player) { - return matching.apply(player); + return !player.isInsideVehicle()&&matching.apply(player); } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/PlayingExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/PlayExperienceSource.java similarity index 78% rename from src/main/java/net/Indyuce/mmocore/experience/source/PlayingExperienceSource.java rename to src/main/java/net/Indyuce/mmocore/experience/source/PlayExperienceSource.java index 63dd4344..d95e6a7b 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/PlayingExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/PlayExperienceSource.java @@ -1,12 +1,10 @@ package net.Indyuce.mmocore.experience.source; -import io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.lib.api.MMOLineConfig; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; -import net.Indyuce.mmocore.loot.chest.RegionBounds; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; @@ -14,17 +12,24 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.scheduler.BukkitRunnable; -public class PlayingExperienceSource extends SpecificExperienceSource { +public class PlayExperienceSource extends SpecificExperienceSource { private final World world; private final double x1, x2, z1, z2; + private final boolean inCombat; /** * Experience source giving the specified amount of xp to all the players online each second in certain world bounds. - *If no bounds are given, it will give the xp to every player online. + * If no bounds are given, it will give the xp to every player online. You can also specifiy if the player + * has to be inCombat or not to get the xp. */ - public PlayingExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { + public PlayExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { super(dispenser, config); + if (!config.contains("in-combat")) + inCombat = false; + else { + inCombat = config.getBoolean("in-combat"); + } if (!config.contains("world")) world = null; @@ -49,13 +54,16 @@ public class PlayingExperienceSource extends SpecificExperienceSource { } @Override - public ExperienceSourceManager newManager() { + public ExperienceSourceManager newManager() { return new PlayingExperienceSourceManager(); } @Override public boolean matchesParameter(PlayerData player, Object obj) { + if (inCombat && !player.isInCombat()) + return false; + if (world == null) return true; Location location = player.getPlayer().getLocation(); @@ -64,7 +72,7 @@ public class PlayingExperienceSource extends SpecificExperienceSource { } - private class PlayingExperienceSourceManager extends ExperienceSourceManager { + private class PlayingExperienceSourceManager extends ExperienceSourceManager { public PlayingExperienceSourceManager() { new BukkitRunnable() { @@ -74,7 +82,7 @@ public class PlayingExperienceSource extends SpecificExperienceSource { Bukkit.getOnlinePlayers().forEach((player) -> { if (!player.hasMetadata("NPC")) { PlayerData playerData = PlayerData.get(player); - for (PlayingExperienceSource source : getSources()) { + for (PlayExperienceSource source : getSources()) { if (source.matchesParameter(playerData, null)) giveExperience(playerData, 1, null); } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/ProjectileExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/ProjectileExperienceSource.java index b912354d..ac2029bd 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/ProjectileExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/ProjectileExperienceSource.java @@ -10,6 +10,7 @@ import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; @@ -17,18 +18,26 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.scheduler.BukkitRunnable; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; +import java.util.function.Function; +import java.util.stream.Collectors; public class ProjectileExperienceSource extends SpecificExperienceSource { - ProjectileType projectileType; + private final ProjectileType projectileType; public ProjectileExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { super(dispenser, config); - Validate.isTrue(config.contains("type")); - projectileType = ProjectileType.valueOf(config.getString("type").toUpperCase().replace("-", "_")); + if(!config.contains("type")) + projectileType=null; + else { + String str=config.getString("type").toUpperCase().replace("-", "_"); + Validate.isTrue(Arrays.stream(ProjectileType.values()).map(ProjectileType::toString).collect(Collectors.toList()).contains(str)); + projectileType = ProjectileType.valueOf(str); + } } @Override @@ -39,8 +48,8 @@ public class ProjectileExperienceSource extends SpecificExperienceSource p instanceof Arrow), + TRIDENT((p)-> p instanceof Trident), + FIREBALL((p)-> p instanceof Fireball), + FISH_HOOK((p)-> p instanceof FishHook), ; - private final Class clazz; + private final Function matching; - ProjectileType(Class clazz) { - this.clazz = clazz; + ProjectileType(Function matching) { + this.matching=matching; } - public Class getType() { - return clazz; - } public boolean matches(Projectile projectile) { - return projectile.getClass().isAssignableFrom(getType()); + return matching.apply(projectile); } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/ResourceExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/ResourceExperienceSource.java new file mode 100644 index 00000000..5b615af9 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/experience/source/ResourceExperienceSource.java @@ -0,0 +1,63 @@ +package net.Indyuce.mmocore.experience.source; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; +import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; +import org.apache.commons.lang.Validate; +import org.bukkit.event.EventHandler; + +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ResourceExperienceSource extends SpecificExperienceSource { + private final PlayerResource resource; + + + /** + * Gives experience when the player uses a specific resoure. If no resource is precised it will trigger for + * mana, stamina and stellium. The amount specified si the xp given per resource consummed. + */ + public ResourceExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { + super(dispenser, config); + if (!config.contains("resource")) + resource = null; + else { + String str = config.getString("resource").toUpperCase().replace("-", "_"); + Validate.isTrue(str.equals("MANA") || str.equals("STELLIUM") || str.equals("STAMINA"), + "ResourceExperienceSource problem: The resource can only be mana, stamina or STELLIUM"); + resource = PlayerResource.valueOf(str); + } + + + } + + @Override + public ExperienceSourceManager newManager() { + return new ExperienceSourceManager() { + @EventHandler + public void onResource(PlayerResourceUpdateEvent e) { + if (e.getPlayer().hasMetadata("NPC")) + return; + + PlayerData playerData = PlayerData.get(e.getPlayer()); + if(e.getAmount()<0) + for (ResourceExperienceSource source : getSources()) { + if (source.matchesParameter(playerData, e.getResource())) + source.giveExperience(playerData, -e.getAmount(), null); + } + } + }; + } + + @Override + public boolean matchesParameter(PlayerData player, PlayerResource obj) { + if (resource == null) + return !obj.equals(PlayerResource.HEALTH); + return resource.equals(obj); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/RideExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/RideExperienceSource.java index f4a2c472..5f10376e 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/RideExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/RideExperienceSource.java @@ -6,6 +6,7 @@ import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; @@ -25,12 +26,12 @@ public class RideExperienceSource extends SpecificExperienceSource newManager() { - return new ExperienceSourceManager() { + public ExperienceSourceManager newManager() { + return new ExperienceSourceManager() { @EventHandler public void onWolfHit(EntityDamageByEntityEvent e) { if(e.getDamager() instanceof Wolf) { Wolf wolf= (Wolf) e.getDamager(); if(wolf.getOwner() instanceof Player &&!((Player) wolf.getOwner()).hasMetadata("NPC")) { PlayerData playerData=PlayerData.get((OfflinePlayer) wolf.getOwner()); - for(TamingExperienceSource source:getSources()) { + for(TameExperienceSource source:getSources()) { source.giveExperience(playerData,e.getDamage(), MMOCoreUtils.getCenterLocation(e.getEntity())); } } diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/VanillaExperienceExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/VanillaExperienceExperienceSource.java new file mode 100644 index 00000000..f4eb3d22 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/experience/source/VanillaExperienceExperienceSource.java @@ -0,0 +1,39 @@ +package net.Indyuce.mmocore.experience.source; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; +import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; +import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; +import org.apache.commons.lang.Validate; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerExpChangeEvent; + +public class VanillaExperienceExperienceSource extends SpecificExperienceSource { + + + public VanillaExperienceExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { + super(dispenser, config); + } + + @Override + public ExperienceSourceManager newManager() { + return new ExperienceSourceManager() { + @EventHandler + public void onExp(PlayerExpChangeEvent e) { + if(e.getPlayer().hasMetadata("NPC")) + return; + PlayerData playerData=PlayerData.get(e.getPlayer()); + for(VanillaExperienceExperienceSource source:getSources()) { + if(source.matchesParameter(playerData,null)) + giveExperience(playerData,e.getAmount(),null); + } + } + }; + } + + @Override + public boolean matchesParameter(PlayerData player, Object obj) { + return true; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java b/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java index 6e62560c..b6b0dd9a 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/source/type/SpecificExperienceSource.java @@ -5,11 +5,13 @@ import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.jetbrains.annotations.Nullable; public abstract class SpecificExperienceSource extends ExperienceSource { private final RandomAmount amount; + double counter = 0; /** * Used to register experience sources with SPECIFIC experience outputs. @@ -42,6 +44,8 @@ public abstract class SpecificExperienceSource extends ExperienceSource { * @param hologramLocation Location used to display the exp hologram */ public void giveExperience(PlayerData player, double multiplier, @Nullable Location hologramLocation) { + counter+=rollAmount() * multiplier; + Bukkit.broadcastMessage("Gave xp " + counter+ " from " + this.getClass().getSimpleName()); getDispenser().giveExperience(player, rollAmount() * multiplier, hologramLocation, EXPSource.SOURCE); } }