diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talismans.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talismans.java index 99698d0..5ca087c 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talismans.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/Talismans.java @@ -8,6 +8,7 @@ import com.willfp.eco.util.config.updating.annotations.ConfigUpdater; import com.willfp.talismans.talismans.talismans.ArcheryTalisman; import com.willfp.talismans.talismans.talismans.CreeperTalisman; import com.willfp.talismans.talismans.talismans.EndTalisman; +import com.willfp.talismans.talismans.talismans.ExperienceTalisman; import com.willfp.talismans.talismans.talismans.FeatherTalisman; import com.willfp.talismans.talismans.talismans.FlameTalisman; import com.willfp.talismans.talismans.talismans.NetherTalisman; @@ -45,6 +46,7 @@ public class Talismans { public static final Talisman FLAME_TALISMAN = new FlameTalisman(); public static final Talisman ARCHERY_TALISMAN = new ArcheryTalisman(); public static final Talisman POSEIDON_TALISMAN = new PoseidonTalisman(); + public static final Talisman EXPERIENCE_TALISMAN = new ExperienceTalisman(); /** * Get all registered {@link Talisman}s. diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/talismans/ExperienceTalisman.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/talismans/ExperienceTalisman.java new file mode 100644 index 0000000..0d22d8c --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/talismans/ExperienceTalisman.java @@ -0,0 +1,34 @@ +package com.willfp.talismans.talismans.talismans; + +import com.willfp.eco.util.events.naturalexpgainevent.NaturalExpGainEvent; +import com.willfp.talismans.talismans.Talisman; +import com.willfp.talismans.talismans.Talismans; +import com.willfp.talismans.talismans.util.TalismanChecks; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.jetbrains.annotations.NotNull; + +public class ExperienceTalisman extends Talisman { + public ExperienceTalisman() { + super("experience_talisman"); + } + + @EventHandler + public void onExpChange(@NotNull final NaturalExpGainEvent event) { + Player player = event.getExpChangeEvent().getPlayer(); + + if (event.getExpChangeEvent().getAmount() < 0) { + return; + } + + if (!TalismanChecks.hasTalisman(player, this)) { + return; + } + + if (this.getDisabledWorlds().contains(player.getWorld())) { + return; + } + + event.getExpChangeEvent().setAmount((int) Math.ceil(event.getExpChangeEvent().getAmount() * (1 + (this.getConfig().getDouble(Talismans.CONFIG_LOCATION + "percentage-bonus") / 100)))); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java index 2f25af5..387d0c0 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/talismans/talismans/util/TalismanChecks.java @@ -94,4 +94,16 @@ public class TalismanChecks { return found; } + + /** + * Get if a player has a specific talisman active. + * + * @param player The player to query. + * @param talisman The talisman to search for. + * @return A set of all found talismans. + */ + public static boolean hasTalisman(@NotNull final Player player, + @NotNull final Talisman talisman) { + return getTalismansOnPlayer(player).contains(talisman); + } } diff --git a/eco-core/core-plugin/src/main/resources/talismans/experiencetalisman.yml b/eco-core/core-plugin/src/main/resources/talismans/experiencetalisman.yml new file mode 100644 index 0000000..d0d8bdf --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/talismans/experiencetalisman.yml @@ -0,0 +1,27 @@ +name: "Experience Talisman" +description: Gain 25% more experience. +enabled: true + +obtaining: + # Recipes are left-right, top-bottom + # The first item is the top left, the second is top middle, and so on. The last is bottom right. + recipe: + - rotten_flesh + - rotten_flesh + - rotten_flesh + + - rotten_flesh + - iron_block + - rotten_flesh + + - rotten_flesh + - rotten_flesh + - rotten_flesh + +general-config: + disabled-in-worlds: [] + # Texture is base64, https://minecraft-heads.com has a list of skulls. + texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmRlYWVjMzQ0YWIwOTViNDhjZWFkNzUyN2Y3ZGVlNjFiMDYzZmY3OTFmNzZhOGZhNzY2NDJjODY3NmUyMTczIn19fQ== + +config: + percentage-bonus: 25 \ No newline at end of file