Fixed some exp sources working across some classes/professions

This commit is contained in:
Jules 2024-05-23 23:34:39 -07:00
parent 0e5ac9ce3a
commit 6e739b3787
21 changed files with 489 additions and 491 deletions

View File

@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
* Used to differenciate between the main class experience and * Used to differentiate between the main class experience and
* experience given in a specific profession. Also being used to * experience given in a specific profession. Also being used to
* monitor EXP holograms. * monitor EXP holograms.
* *

View File

@ -3,9 +3,9 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -44,7 +44,10 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
@Override @Override
public ExperienceSourceManager<BrewPotionExperienceSource> newManager() { public ExperienceSourceManager<BrewPotionExperienceSource> newManager() {
return new ExperienceSourceManager<BrewPotionExperienceSource>() { return new Manager();
}
private static class Manager extends ExperienceSourceManager<BrewPotionExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(BrewEvent event) { public void a(BrewEvent event) {
@ -62,11 +65,9 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
PlayerData data = PlayerData.get(playerOpt.get()); PlayerData data = PlayerData.get(playerOpt.get());
for (BrewPotionExperienceSource source : getSources()) for (BrewPotionExperienceSource source : getSources())
if (source.matches(data, (PotionMeta) brewn.getItemMeta())) if (source.matches(data, (PotionMeta) brewn.getItemMeta()))
new PotionUpgrade(found, brewn).process(data.getPlayer()); new PotionUpgrade(found, brewn).process(source, data.getPlayer());
}); });
} }
};
}
private ItemStack findPotion(BrewerInventory inv) { private ItemStack findPotion(BrewerInventory inv) {
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
@ -80,8 +81,9 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
private Optional<Player> getNearbyPlayer(Location loc) { private Optional<Player> getNearbyPlayer(Location loc) {
return loc.getWorld().getPlayers().stream().filter(player -> player.getLocation().distanceSquared(loc) < 100).findAny(); return loc.getWorld().getPlayers().stream().filter(player -> player.getLocation().distanceSquared(loc) < 100).findAny();
} }
}
public class PotionUpgrade { private static class PotionUpgrade {
/* /*
* if the potion was extended using redstone or upgraded using * if the potion was extended using redstone or upgraded using
@ -161,14 +163,14 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
// effect.getType() == type).findFirst(); // effect.getType() == type).findFirst();
// } // }
public void process(Player player) { public void process(BrewPotionExperienceSource source, Player player) {
/* /*
* calculate extra exp due to extra effects * calculate extra exp due to extra effects
*/ */
// exp += getTotal(mapEffectDurations()); // exp += getTotal(mapEffectDurations());
getDispenser().giveExperience(PlayerData.get(player), exp * multiplier, player.getLocation(), EXPSource.SOURCE); source.getDispenser().giveExperience(PlayerData.get(player), exp * source.multiplier, player.getLocation(), EXPSource.SOURCE);
} }
} }
} }

View File

@ -11,7 +11,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import static org.bukkit.event.EventPriority.HIGHEST; import static org.bukkit.event.EventPriority.HIGHEST;
import static org.bukkit.event.EventPriority.MONITOR;
public class ClimbExperienceSource extends SpecificExperienceSource<Material> { public class ClimbExperienceSource extends SpecificExperienceSource<Material> {
//Can be Ladder,Vines,Twisting Vines,Weeping Vines. //Can be Ladder,Vines,Twisting Vines,Weeping Vines.
@ -36,28 +35,11 @@ public class ClimbExperienceSource extends SpecificExperienceSource<Material> {
type = Material.valueOf(str); type = Material.valueOf(str);
} }
} }
@Override @Override
public ExperienceSourceManager<ClimbExperienceSource> newManager() { public ExperienceSourceManager<ClimbExperienceSource> newManager() {
return new ExperienceSourceManager<ClimbExperienceSource>() { return new Manager();
@EventHandler(priority = HIGHEST,ignoreCancelled = true)
public void onClimb(PlayerMoveEvent e) {
double delta=e.getTo().getBlockY()-e.getFrom().getBlockY();
if (delta > 0) {
if (e.getPlayer().hasMetadata("NPC"))
return;
PlayerData playerData = PlayerData.get(e.getPlayer());
for (ClimbExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, e.getFrom().getBlock().getType()))
source.giveExperience(playerData, delta, null);
}
}
}
};
} }
@Override @Override
@ -71,6 +53,22 @@ public class ClimbExperienceSource extends SpecificExperienceSource<Material> {
if (type.equals(Material.TWISTING_VINES)) if (type.equals(Material.TWISTING_VINES))
return material.equals(Material.TWISTING_VINES) || material.equals(Material.TWISTING_VINES_PLANT); return material.equals(Material.TWISTING_VINES) || material.equals(Material.TWISTING_VINES_PLANT);
return material.equals(type); return material.equals(type);
}
private static class Manager extends ExperienceSourceManager<ClimbExperienceSource> {
@EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onClimb(PlayerMoveEvent e) {
double delta = e.getTo().getBlockY() - e.getFrom().getBlockY();
if (delta > 0) {
if (e.getPlayer().hasMetadata("NPC"))
return;
PlayerData playerData = PlayerData.get(e.getPlayer());
for (ClimbExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, e.getFrom().getBlock().getType()))
source.giveExperience(playerData, delta, null);
}
}
}
} }
} }

View File

@ -3,8 +3,8 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -30,11 +30,19 @@ public class CraftItemExperienceSource extends SpecificExperienceSource<Material
@Override @Override
public ExperienceSourceManager<CraftItemExperienceSource> newManager() { public ExperienceSourceManager<CraftItemExperienceSource> newManager() {
return new ExperienceSourceManager<CraftItemExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
}
private static class Manager extends ExperienceSourceManager<CraftItemExperienceSource> {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void a(CraftItemEvent event) { public void a(CraftItemEvent event) {
if (event.getAction() == InventoryAction.NOTHING || if (event.getAction() == InventoryAction.NOTHING || event.getInventory().getResult() == null) return;
event.getInventory().getResult() == null) return;
PlayerData data = PlayerData.get((Player) event.getWhoClicked()); PlayerData data = PlayerData.get((Player) event.getWhoClicked());
@ -64,8 +72,7 @@ public class CraftItemExperienceSource extends SpecificExperienceSource<Material
// First check // First check
int newAmount = getAmount(event.getInventory().getMatrix()[index]); int newAmount = getAmount(event.getInventory().getMatrix()[index]);
if (newAmount >= oldAmount) if (newAmount >= oldAmount) return;
return;
// Deduce amount crafted // Deduce amount crafted
int amountCrafted = (event.getClick().isShiftClick() ? oldAmount - newAmount : 1) * itemsCraftedPerRecipe; int amountCrafted = (event.getClick().isShiftClick() ? oldAmount - newAmount : 1) * itemsCraftedPerRecipe;
@ -74,13 +81,6 @@ public class CraftItemExperienceSource extends SpecificExperienceSource<Material
source.giveExperience(data, amountCrafted, event.getInventory().getLocation()); source.giveExperience(data, amountCrafted, event.getInventory().getLocation());
}); });
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
}
private int getAmount(@Nullable ItemStack item) { private int getAmount(@Nullable ItemStack item) {
return item == null || item.getType() == Material.AIR ? 0 : item.getAmount(); return item == null || item.getType() == Material.AIR ? 0 : item.getAmount();
@ -101,4 +101,5 @@ public class CraftItemExperienceSource extends SpecificExperienceSource<Material
Validate.isTrue(index != -1, "No item in matrix"); Validate.isTrue(index != -1, "No item in matrix");
return index; return index;
} }
}
} }

View File

@ -3,7 +3,6 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.event.PlayerAttackEvent; import io.lumine.mythic.lib.api.event.PlayerAttackEvent;
import io.lumine.mythic.lib.damage.DamagePacket;
import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.damage.DamageType;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
@ -40,14 +39,22 @@ public class DamageDealtExperienceSource extends SpecificExperienceSource<Void>
@Override @Override
public ExperienceSourceManager<DamageDealtExperienceSource> newManager() { public ExperienceSourceManager<DamageDealtExperienceSource> newManager() {
return new ExperienceSourceManager<DamageDealtExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Void v) {
return true;
}
private static class Manager extends ExperienceSourceManager<DamageDealtExperienceSource> {
@EventHandler(priority = MONITOR, ignoreCancelled = true) @EventHandler(priority = MONITOR, ignoreCancelled = true)
public void onDamageDealt(PlayerAttackEvent event) { public void onDamageDealt(PlayerAttackEvent event) {
final PlayerData playerData = PlayerData.get(event.getPlayer()); final PlayerData playerData = PlayerData.get(event.getPlayer());
for (DamageDealtExperienceSource source : getSources()) for (DamageDealtExperienceSource source : getSources())
if (source.matches(playerData, null)) { if (source.matches(playerData, null)) {
double value = event.getDamage().getDamage(source.type); double value = source.type == null ? event.getDamage().getDamage() : event.getDamage().getDamage(source.type);
if (value == 0) continue; if (value == 0) continue;
// Cannot count more than the entity's max health // Cannot count more than the entity's max health
@ -56,11 +63,5 @@ public class DamageDealtExperienceSource extends SpecificExperienceSource<Void>
source.giveExperience(playerData, value, null); source.giveExperience(playerData, value, null);
} }
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, Void v) {
return true;
} }
} }

View File

@ -43,7 +43,17 @@ public class DamageTakenExperienceSource extends SpecificExperienceSource<Entity
@Override @Override
public ExperienceSourceManager<DamageTakenExperienceSource> newManager() { public ExperienceSourceManager<DamageTakenExperienceSource> newManager() {
return new ExperienceSourceManager<DamageTakenExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, EntityDamageEvent.DamageCause damageCause) {
if (player.getPlayer().isDead()) return false;
return cause == null || damageCause.equals(cause);
}
private static class Manager extends ExperienceSourceManager<DamageTakenExperienceSource> {
@EventHandler(priority = HIGHEST, ignoreCancelled = true) @EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onDamageTaken(EntityDamageEvent event) { public void onDamageTaken(EntityDamageEvent event) {
@ -68,12 +78,5 @@ public class DamageTakenExperienceSource extends SpecificExperienceSource<Entity
} }
}.runTaskLater(MMOCore.plugin, 2); }.runTaskLater(MMOCore.plugin, 2);
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, EntityDamageEvent.DamageCause damageCause) {
if (player.getPlayer().isDead()) return false;
return cause == null || damageCause.equals(cause);
} }
} }

View File

@ -33,7 +33,18 @@ public class EatExperienceSource extends SpecificExperienceSource<ItemStack> {
@Override @Override
public ExperienceSourceManager<EatExperienceSource> newManager() { public ExperienceSourceManager<EatExperienceSource> newManager() {
return new ExperienceSourceManager<EatExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
if(type==null)
return true;
return type.equals(obj.getType());
}
private static class Manager extends ExperienceSourceManager<EatExperienceSource> {
@EventHandler(priority = MONITOR,ignoreCancelled = true) @EventHandler(priority = MONITOR,ignoreCancelled = true)
public void a(PlayerItemConsumeEvent e) { public void a(PlayerItemConsumeEvent e) {
@ -45,14 +56,5 @@ public class EatExperienceSource extends SpecificExperienceSource<ItemStack> {
} }
} }
} }
};
} }
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
if(type==null)
return true;
return type.equals(obj.getType());
}
} }

View File

@ -4,9 +4,9 @@ import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -41,7 +41,10 @@ public class EnchantItemExperienceSource extends ExperienceSource<Void> {
@Override @Override
public ExperienceSourceManager<EnchantItemExperienceSource> newManager() { public ExperienceSourceManager<EnchantItemExperienceSource> newManager() {
return new ExperienceSourceManager<EnchantItemExperienceSource>() { return new Manager();
}
private static class Manager extends ExperienceSourceManager<EnchantItemExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(EnchantItemEvent event) { public void a(EnchantItemEvent event) {
@ -60,9 +63,8 @@ public class EnchantItemExperienceSource extends ExperienceSource<Void> {
double exp = 0; double exp = 0;
for (Entry<Enchantment, Integer> entry : applicableEnchants.entrySet()) for (Entry<Enchantment, Integer> entry : applicableEnchants.entrySet())
exp += MMOCore.plugin.enchantManager.getBaseExperience(entry.getKey()) * entry.getValue(); exp += MMOCore.plugin.enchantManager.getBaseExperience(entry.getKey()) * entry.getValue();
getDispenser().giveExperience(player, exp, event.getEnchantBlock().getLocation(), EXPSource.SOURCE); source.getDispenser().giveExperience(player, exp, event.getEnchantBlock().getLocation(), EXPSource.SOURCE);
} }
} }
};
} }
} }

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
@ -25,7 +25,15 @@ public class FishItemExperienceSource extends SpecificExperienceSource<ItemStack
@Override @Override
public ExperienceSourceManager<FishItemExperienceSource> newManager() { public ExperienceSourceManager<FishItemExperienceSource> newManager() {
return new ExperienceSourceManager<FishItemExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
return obj.getType() == material;
}
private static class Manager extends ExperienceSourceManager<FishItemExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(PlayerFishEvent event) { public void a(PlayerFishEvent event) {
@ -40,11 +48,5 @@ public class FishItemExperienceSource extends SpecificExperienceSource<ItemStack
source.giveExperience(data, caught.getAmount(), event.getHook().getLocation().add(0, 1.0f, 0)); source.giveExperience(data, caught.getAmount(), event.getHook().getLocation().add(0, 1.0f, 0));
} }
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
return obj.getType() == material;
} }
} }

View File

@ -33,7 +33,15 @@ public class FromExperienceSource extends ExperienceSource {
@Override @Override
public ExperienceSourceManager<FromExperienceSource> newManager() { public ExperienceSourceManager<FromExperienceSource> newManager() {
return new ExperienceSourceManager<>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Object obj) {
return false;
}
private static class Manager extends ExperienceSourceManager<FromExperienceSource> {
/** /**
* Used to register all the children experience sources. * Used to register all the children experience sources.
@ -42,11 +50,5 @@ public class FromExperienceSource extends ExperienceSource {
public void registerSource(FromExperienceSource source) { public void registerSource(FromExperienceSource source) {
source.experienceSources.forEach(expSource -> MMOCore.plugin.experience.registerSource(expSource)); source.experienceSources.forEach(expSource -> MMOCore.plugin.experience.registerSource(expSource));
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, Object obj) {
return false;
} }
} }

View File

@ -38,7 +38,16 @@ public class KillMobExperienceSource extends SpecificExperienceSource<Entity> {
@Override @Override
public ExperienceSourceManager<KillMobExperienceSource> newManager() { public ExperienceSourceManager<KillMobExperienceSource> newManager() {
return new ExperienceSourceManager<KillMobExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Entity obj) {
return obj.getType() == type && (displayName == null || displayName.equals(obj.getCustomName()));
}
private static class Manager extends ExperienceSourceManager<KillMobExperienceSource> {
/** /**
* This map is used to keep track of the last player who * This map is used to keep track of the last player who
@ -71,11 +80,5 @@ public class KillMobExperienceSource extends SpecificExperienceSource<Entity> {
if (source.matches(data, event.getEntity())) if (source.matches(data, event.getEntity()))
source.giveExperience(data, 1, MMOCoreUtils.getCenterLocation(event.getEntity())); source.giveExperience(data, 1, MMOCoreUtils.getCenterLocation(event.getEntity()));
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, Entity obj) {
return obj.getType() == type && (displayName == null || displayName.equals(obj.getCustomName()));
} }
} }

View File

@ -4,8 +4,8 @@ import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
@ -40,7 +40,16 @@ public class MineBlockExperienceSource extends SpecificExperienceSource<Material
@Override @Override
public ExperienceSourceManager<MineBlockExperienceSource> newManager() { public ExperienceSourceManager<MineBlockExperienceSource> newManager() {
return new ExperienceSourceManager<MineBlockExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
}
private static class Manager extends ExperienceSourceManager<MineBlockExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(BlockBreakEvent event) { public void a(BlockBreakEvent event) {
if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) return; if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) return;
@ -49,27 +58,18 @@ public class MineBlockExperienceSource extends SpecificExperienceSource<Material
PlayerData data = PlayerData.get(event.getPlayer()); PlayerData data = PlayerData.get(event.getPlayer());
for (MineBlockExperienceSource source : getSources()) { for (MineBlockExperienceSource source : getSources()) {
if (source.silkTouch && hasSilkTouch(event.getPlayer().getInventory().getItemInMainHand())) if (source.silkTouch && hasSilkTouch(event.getPlayer().getInventory().getItemInMainHand())) continue;
continue;
if (source.crop && !MythicLib.plugin.getVersion().getWrapper().isCropFullyGrown(event.getBlock())) if (source.crop && !MythicLib.plugin.getVersion().getWrapper().isCropFullyGrown(event.getBlock()))
continue; continue;
if (!source.playerPlaced && event.getBlock().hasMetadata("player_placed")) if (!source.playerPlaced && event.getBlock().hasMetadata("player_placed")) continue;
continue;
if (source.matches(data, event.getBlock().getType())) if (source.matches(data, event.getBlock().getType()))
source.giveExperience(data, 1, event.getBlock().getLocation()); source.giveExperience(data, 1, event.getBlock().getLocation());
} }
} }
};
}
private boolean hasSilkTouch(ItemStack item) { private boolean hasSilkTouch(ItemStack item) {
return item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.SILK_TOUCH); return item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.SILK_TOUCH);
} }
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
} }
} }

View File

@ -36,27 +36,7 @@ public class MoveExperienceSource extends SpecificExperienceSource {
@Override @Override
public ExperienceSourceManager<MoveExperienceSource> newManager() { public ExperienceSourceManager<MoveExperienceSource> newManager() {
return new ExperienceSourceManager<MoveExperienceSource>() { return new Manager();
@EventHandler(priority = MONITOR,ignoreCancelled = true)
public void onMove(PlayerMoveEvent e) {
double deltax = e.getTo().getBlockX() - e.getFrom().getBlockX();
double deltay = e.getTo().getBlockY() - e.getFrom().getBlockY();
double deltaz = e.getTo().getBlockZ() - e.getFrom().getBlockZ();
if (deltax != 0 || deltay != 0 || deltaz != 0) {
double delta = Math.sqrt(deltax * deltax + deltay * deltay + deltaz * deltaz);
if (e.getPlayer().hasMetadata("NPC"))
return;
Player player = e.getPlayer();
PlayerData playerData = PlayerData.get(player);
for (MoveExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, null)) {
giveExperience(playerData, delta, null);
}
}
}
}
};
} }
@Override @Override
@ -69,7 +49,7 @@ public class MoveExperienceSource extends SpecificExperienceSource {
FLY((p) -> p.isFlying() || p.isGliding()), FLY((p) -> p.isFlying() || p.isGliding()),
SWIM((p) -> p.getLocation().getBlock().isLiquid()), SWIM((p) -> p.getLocation().getBlock().isLiquid()),
SPRINT(Player::isSprinting), SPRINT(Player::isSprinting),
WALK((p) -> !p.isSneaking() && !p.isSprinting() &&((Entity)p).isOnGround()&& !p.isFlying() && !p.getLocation().getBlock().isLiquid()); WALK((p) -> !p.isSneaking() && !p.isSprinting() && ((Entity) p).isOnGround() && !p.isFlying() && !p.getLocation().getBlock().isLiquid());
private final Function<Player, Boolean> matching; private final Function<Player, Boolean> matching;
@ -82,4 +62,24 @@ public class MoveExperienceSource extends SpecificExperienceSource {
} }
} }
private static class Manager extends ExperienceSourceManager<MoveExperienceSource> {
@EventHandler(priority = MONITOR, ignoreCancelled = true)
public void onMove(PlayerMoveEvent e) {
double deltax = e.getTo().getBlockX() - e.getFrom().getBlockX();
double deltay = e.getTo().getBlockY() - e.getFrom().getBlockY();
double deltaz = e.getTo().getBlockZ() - e.getFrom().getBlockZ();
if (deltax != 0 || deltay != 0 || deltaz != 0) {
double delta = Math.sqrt(deltax * deltax + deltay * deltay + deltaz * deltaz);
if (e.getPlayer().hasMetadata("NPC"))
return;
Player player = e.getPlayer();
PlayerData playerData = PlayerData.get(player);
for (MoveExperienceSource source : getSources())
if (source.matchesParameter(playerData, null))
source.giveExperience(playerData, delta, null);
}
}
}
} }

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
@ -23,7 +23,16 @@ public class PlaceBlockExperienceSource extends SpecificExperienceSource<Materia
@Override @Override
public ExperienceSourceManager<PlaceBlockExperienceSource> newManager() { public ExperienceSourceManager<PlaceBlockExperienceSource> newManager() {
return new ExperienceSourceManager<PlaceBlockExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
}
private static class Manager extends ExperienceSourceManager<PlaceBlockExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(BlockPlaceEvent event) { public void a(BlockPlaceEvent event) {
@ -35,11 +44,5 @@ public class PlaceBlockExperienceSource extends SpecificExperienceSource<Materia
if (source.matches(data, event.getBlock().getType())) if (source.matches(data, event.getBlock().getType()))
source.giveExperience(data, 1, event.getBlock().getLocation()); source.giveExperience(data, 1, event.getBlock().getLocation());
} }
};
}
@Override
public boolean matchesParameter(PlayerData player, Material obj) {
return material == obj;
} }
} }

View File

@ -15,7 +15,6 @@ import org.bukkit.scheduler.BukkitRunnable;
import java.util.Objects; import java.util.Objects;
public class PlayExperienceSource extends SpecificExperienceSource { public class PlayExperienceSource extends SpecificExperienceSource {
private final World world; private final World world;
private final double x1, x2, z1, z2; private final double x1, x2, z1, z2;
private final boolean inCombat; private final boolean inCombat;
@ -48,7 +47,7 @@ public class PlayExperienceSource extends SpecificExperienceSource {
@Override @Override
public ExperienceSourceManager<PlayExperienceSource> newManager() { public ExperienceSourceManager<PlayExperienceSource> newManager() {
return new PlayingExperienceSourceManager(); return new Manager();
} }
@ -65,9 +64,9 @@ public class PlayExperienceSource extends SpecificExperienceSource {
} }
private class PlayingExperienceSourceManager extends ExperienceSourceManager<PlayExperienceSource> { private static class Manager extends ExperienceSourceManager<PlayExperienceSource> {
public PlayingExperienceSourceManager() { public Manager() {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
@ -77,7 +76,7 @@ public class PlayExperienceSource extends SpecificExperienceSource {
PlayerData playerData = PlayerData.get(player); PlayerData playerData = PlayerData.get(player);
for (PlayExperienceSource source : getSources()) for (PlayExperienceSource source : getSources())
if (source.matchesParameter(playerData, null)) if (source.matchesParameter(playerData, null))
giveExperience(playerData, 1, null); source. giveExperience(playerData, 1, null);
} }
}); });
} }

View File

@ -1,7 +1,8 @@
package net.Indyuce.mmocore.experience.source; package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import io.lumine.mythic.lib.util.FlushableRegistry;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
@ -16,10 +17,8 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -30,8 +29,7 @@ public class ProjectileExperienceSource extends SpecificExperienceSource<Project
public ProjectileExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { public ProjectileExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) {
super(dispenser, config); super(dispenser, config);
if (!config.contains("type")) if (!config.contains("type")) projectileType = null;
projectileType = null;
else { else {
String str = config.getString("type").toUpperCase().replace("-", "_"); String str = config.getString("type").toUpperCase().replace("-", "_");
Validate.isTrue(Arrays.stream(ProjectileType.values()).map(ProjectileType::toString).collect(Collectors.toList()).contains(str)); Validate.isTrue(Arrays.stream(ProjectileType.values()).map(ProjectileType::toString).collect(Collectors.toList()).contains(str));
@ -41,76 +39,17 @@ public class ProjectileExperienceSource extends SpecificExperienceSource<Project
@Override @Override
public ExperienceSourceManager<ProjectileExperienceSource> newManager() { public ExperienceSourceManager<ProjectileExperienceSource> newManager() {
return new Manager();
return new ExperienceSourceManager<ProjectileExperienceSource>() {
HashMap<Projectile, Location> projectiles = new HashMap<>();
@EventHandler(priority = HIGHEST,ignoreCancelled = true)
public void onHit(ProjectileHitEvent e) {
if (e.getHitBlock() != null && projectiles.containsKey(e.getEntity()))
projectiles.remove(e.getEntity());
}
@EventHandler(priority = HIGHEST,ignoreCancelled = true)
public void onDamage(EntityDamageByEntityEvent e) {
if (e.getEntity() instanceof Projectile) {
Projectile projectile = (Projectile) e.getEntity();
if (!projectiles.containsKey(projectile))
return;
if (projectile.getShooter() instanceof Player && !((Player) projectile.getShooter()).hasMetadata("NPC")) {
Player player = (Player) projectile.getShooter();
PlayerData playerData = PlayerData.get(player);
double distance = projectiles.get(projectile).distance(e.getEntity().getLocation());
for (ProjectileExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, projectile))
source.giveExperience(playerData, e.getFinalDamage() * distance, null);
}
}
projectiles.remove(projectile);
}
}
//Mark every arrow with the the location at which it was shot to calculate the distance
@EventHandler
public void onLaunch(ProjectileLaunchEvent e) {
if (e.getEntity().getShooter() instanceof Player) {
Player player = (Player) e.getEntity().getShooter();
if (player.hasMetadata("NPC"))
return;
projectiles.put(e.getEntity(), e.getLocation());
//Remove the projectile 15 s after it was launched
new BukkitRunnable() {
@Override
public void run() {
projectiles.remove(e.getEntity());
}
}.runTaskLater(MMOCore.plugin, 60 * 20L);
}
}
};
} }
@Override @Override
public boolean matchesParameter(PlayerData player, Projectile projectile) { public boolean matchesParameter(PlayerData player, Projectile projectile) {
if (projectileType == null) if (projectileType == null) return true;
return true;
return projectileType.matches(projectile); return projectileType.matches(projectile);
} }
public enum ProjectileType { public enum ProjectileType {
ARROW((p) -> p instanceof Arrow), ARROW((p) -> p instanceof Arrow), TRIDENT((p) -> p instanceof Trident);
TRIDENT((p) -> p instanceof Trident);
private final Function<Projectile, Boolean> matching; private final Function<Projectile, Boolean> matching;
@ -124,4 +63,41 @@ public class ProjectileExperienceSource extends SpecificExperienceSource<Project
} }
} }
private static class Manager extends ExperienceSourceManager<ProjectileExperienceSource> {
private final FlushableRegistry<Projectile, Location> projectiles = new FlushableRegistry<>((proj, loc) -> proj.isDead(), 20 * 60);
@EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onHit(ProjectileHitEvent e) {
if (e.getHitBlock() != null) projectiles.getRegistry().remove(e.getEntity());
}
@EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onDamage(EntityDamageByEntityEvent e) {
if (e.getEntity() instanceof Projectile) {
Projectile projectile = (Projectile) e.getEntity();
Location loc = projectiles.getRegistry().get(projectile);
if (loc == null) return;
if (projectile.getShooter() instanceof Player && !((Player) projectile.getShooter()).hasMetadata("NPC")) {
Player player = (Player) projectile.getShooter();
PlayerData playerData = PlayerData.get(player);
double distance = loc.distance(e.getEntity().getLocation());
for (ProjectileExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, projectile))
source.giveExperience(playerData, e.getFinalDamage() * distance, null);
}
}
}
}
// Mark every arrow with the location at which it was shot to calculate the distance
@EventHandler
public void onLaunch(ProjectileLaunchEvent e) {
if (e.getEntity().getShooter() instanceof Player && UtilityMethods.isRealPlayer((Player) e.getEntity().getShooter())) {
projectiles.getRegistry().put(e.getEntity(), e.getLocation());
}
}
}
} }

View File

@ -41,10 +41,10 @@ public class RepairItemExperienceSource extends ExperienceSource<ItemStack> {
@Override @Override
public ExperienceSourceManager<RepairItemExperienceSource> newManager() { public ExperienceSourceManager<RepairItemExperienceSource> newManager() {
return new CustomExperienceManager(); return new Manager();
} }
private class CustomExperienceManager extends ExperienceSourceManager<RepairItemExperienceSource> { private static class Manager extends ExperienceSourceManager<RepairItemExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(InventoryClickEvent event) { public void a(InventoryClickEvent event) {
@ -80,7 +80,7 @@ public class RepairItemExperienceSource extends ExperienceSource<ItemStack> {
*/ */
final double exp = MMOCore.plugin.smithingManager.getBaseExperience(item.getType()) final double exp = MMOCore.plugin.smithingManager.getBaseExperience(item.getType())
* Math.max(0, ((Damageable) old.getItemMeta()).getDamage() - ((Damageable) item.getItemMeta()).getDamage()) / 100; * Math.max(0, ((Damageable) old.getItemMeta()).getDamage() - ((Damageable) item.getItemMeta()).getDamage()) / 100;
getDispenser().giveExperience(data, exp, data.getPlayer().getLocation(), EXPSource.SOURCE); source.getDispenser().giveExperience(data, exp, data.getPlayer().getLocation(), EXPSource.SOURCE);
} }
} }
} }

View File

@ -1,12 +1,13 @@
package net.Indyuce.mmocore.experience.source; package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; 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.PlayerData;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -21,39 +22,37 @@ public class ResourceExperienceSource extends SpecificExperienceSource<PlayerRes
*/ */
public ResourceExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { public ResourceExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) {
super(dispenser, config); super(dispenser, config);
if (!config.contains("type")) if (!config.contains("type")) resource = null;
resource = null;
else { else {
String str = config.getString("type").toUpperCase().replace("-", "_"); String str = config.getString("type").toUpperCase().replace("-", "_");
Validate.isTrue(str.equals("MANA") || str.equals("STELLIUM") || str.equals("STAMINA"), Validate.isTrue(str.equals("MANA") || str.equals("STELLIUM") || str.equals("STAMINA"), "ResourceExperienceSource problem: The resource can only be mana, stamina or STELLIUM");
"ResourceExperienceSource problem: The resource can only be mana, stamina or STELLIUM");
resource = PlayerResource.valueOf(str); resource = PlayerResource.valueOf(str);
} }
} }
@Override @Override
public ExperienceSourceManager<ResourceExperienceSource> newManager() { public ExperienceSourceManager<ResourceExperienceSource> newManager() {
return new ExperienceSourceManager<ResourceExperienceSource>() { return new Manager();
@EventHandler(priority = HIGHEST,ignoreCancelled = true)
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 @Override
public boolean matchesParameter(PlayerData player, PlayerResource obj) { public boolean matchesParameter(PlayerData player, PlayerResource obj) {
if (resource == null) if (resource == null) return !obj.equals(PlayerResource.HEALTH);
return !obj.equals(PlayerResource.HEALTH);
return resource.equals(obj); return resource.equals(obj);
} }
private static class Manager extends ExperienceSourceManager<ResourceExperienceSource> {
@EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onResource(PlayerResourceUpdateEvent event) {
if (!UtilityMethods.isRealPlayer(event.getPlayer())) return;
PlayerData playerData = PlayerData.get(event.getPlayer());
if (event.getAmount() >= 0) return;
for (ResourceExperienceSource source : getSources())
if (source.matchesParameter(playerData, event.getResource()))
source.giveExperience(playerData, -event.getAmount(), null);
}
}
} }

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.experience.source; package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
@ -40,29 +41,7 @@ public class RideExperienceSource extends SpecificExperienceSource<EntityType> {
@Override @Override
public ExperienceSourceManager<RideExperienceSource> newManager() { public ExperienceSourceManager<RideExperienceSource> newManager() {
return new ExperienceSourceManager<RideExperienceSource>() { return new Manager();
@EventHandler(priority = HIGHEST,ignoreCancelled = true)
public void onRide(PlayerMoveEvent e) {
if (e.getPlayer().isInsideVehicle()) {
double deltax = e.getTo().getBlockX() - e.getFrom().getBlockX();
double deltay = e.getTo().getBlockY() - e.getFrom().getBlockY();
double deltaz = e.getTo().getBlockZ() - e.getFrom().getBlockZ();
if (deltax != 0 && deltay != 0 && deltaz != 0) {
double delta = Math.sqrt(deltax * deltax + deltay * deltay + deltaz * deltaz);
if (e.getPlayer().hasMetadata("NPC"))
return;
PlayerData playerData = PlayerData.get(e.getPlayer());
Entity vehicle = e.getPlayer().getVehicle();
for (RideExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, vehicle.getType()))
giveExperience(playerData, e.getFrom().distance(e.getTo()), null);
}
}
}
}
};
} }
@Override @Override
@ -72,4 +51,25 @@ public class RideExperienceSource extends SpecificExperienceSource<EntityType> {
return type.equals(obj); return type.equals(obj);
} }
private static class Manager extends ExperienceSourceManager<RideExperienceSource> {
@EventHandler(priority = HIGHEST, ignoreCancelled = true)
public void onRide(PlayerMoveEvent event) {
if (!event.getPlayer().isInsideVehicle()) return;
double deltax = event.getTo().getBlockX() - event.getFrom().getBlockX();
double deltay = event.getTo().getBlockY() - event.getFrom().getBlockY();
double deltaz = event.getTo().getBlockZ() - event.getFrom().getBlockZ();
if (deltax != 0 || deltay != 0 || deltaz != 0) {
if (!UtilityMethods.isRealPlayer(event.getPlayer())) return;
PlayerData playerData = PlayerData.get(event.getPlayer());
Entity vehicle = event.getPlayer().getVehicle();
for (RideExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, vehicle.getType()))
source.giveExperience(playerData, event.getFrom().distance(event.getTo()), null);
}
}
}
}
} }

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -27,29 +27,31 @@ public class SmeltItemExperienceSource extends SpecificExperienceSource<ItemStac
@Override @Override
public ExperienceSourceManager<SmeltItemExperienceSource> newManager() { public ExperienceSourceManager<SmeltItemExperienceSource> newManager() {
return new ExperienceSourceManager<SmeltItemExperienceSource>() { return new Manager();
}
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
return obj.getType() == material;
}
private static class Manager extends ExperienceSourceManager<SmeltItemExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void a(BlockCookEvent event) { public void a(BlockCookEvent event) {
Optional<Player> player = getNearestPlayer(event.getBlock().getLocation()); Optional<Player> player = getNearestPlayer(event.getBlock().getLocation());
if (!player.isPresent()) if (!player.isPresent()) return;
return;
ItemStack caught = event.getResult(); ItemStack caught = event.getResult();
if (caught.hasItemMeta()) if (caught.hasItemMeta()) return;
return;
PlayerData data = PlayerData.get(player.get()); PlayerData data = PlayerData.get(player.get());
for (SmeltItemExperienceSource source : getSources()) for (SmeltItemExperienceSource source : getSources())
if (source.matches(data, caught)) if (source.matches(data, caught)) source.giveExperience(data, 1, event.getBlock().getLocation());
source.giveExperience(data, 1, event.getBlock().getLocation());
}
};
} }
private Optional<Player> getNearestPlayer(Location loc) { private Optional<Player> getNearestPlayer(Location loc) {
final Player[] nearby = loc.getWorld().getPlayers().stream().filter(player -> player.getLocation().distanceSquared(loc) < 100) final Player[] nearby = loc.getWorld().getPlayers().stream().filter(player -> player.getLocation().distanceSquared(loc) < 100).toArray(Player[]::new);
.toArray(Player[]::new);
Player selected = null; Player selected = null;
double lastDist = 100; double lastDist = 100;
for (Player p : nearby) { for (Player p : nearby) {
@ -61,9 +63,5 @@ public class SmeltItemExperienceSource extends SpecificExperienceSource<ItemStac
} }
return Optional.ofNullable(selected); return Optional.ofNullable(selected);
} }
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
return obj.getType() == material;
} }
} }

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.experience.source; package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
@ -7,38 +8,44 @@ import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityTameEvent;
public class TameExperienceSource extends SpecificExperienceSource { public class TameExperienceSource extends SpecificExperienceSource<EntityType> {
public TameExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) { public TameExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) {
super(dispenser, config); super(dispenser, config);
} }
@Override @Override
public ExperienceSourceManager<TameExperienceSource> newManager() { public ExperienceSourceManager<TameExperienceSource> newManager() {
return new ExperienceSourceManager<TameExperienceSource>() { return new Manager();
@EventHandler(priority = EventPriority.HIGHEST,ignoreCancelled = true)
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(TameExperienceSource source:getSources()) {
source.giveExperience(playerData,e.getDamage(), MMOCoreUtils.getCenterLocation(e.getEntity()));
}
}
}
}
};
} }
@Override @Override
public boolean matchesParameter(PlayerData player, Object obj) { public boolean matchesParameter(PlayerData player, EntityType entityType) {
return false; return true;
}
private static class Manager extends ExperienceSourceManager<TameExperienceSource> {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWolfHit(EntityTameEvent event) {
// Only wolves at the moment
if (!(event.getEntity() instanceof Wolf)) return;
if (!(event.getOwner() instanceof Player) || !UtilityMethods.isRealPlayer((Entity) event.getOwner()))
return;
PlayerData playerData = PlayerData.get((OfflinePlayer) event.getOwner());
for (TameExperienceSource source : getSources())
if (source.matches(playerData, event.getEntity().getType()))
source.giveExperience(playerData, 1, MMOCoreUtils.getCenterLocation(event.getEntity()));
}
} }
} }