mirror of
https://gitlab.com/phoenix-dvpmt/mmocore.git
synced 2025-02-02 11:21:22 +01:00
Fixed some exp sources working across some classes/professions
This commit is contained in:
parent
0e5ac9ce3a
commit
6e739b3787
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user