diff --git a/.gradle/7.3.3/checksums/checksums.lock b/.gradle/7.3.3/checksums/checksums.lock index 4829060..a2e9516 100644 Binary files a/.gradle/7.3.3/checksums/checksums.lock and b/.gradle/7.3.3/checksums/checksums.lock differ diff --git a/.gradle/7.3.3/executionHistory/executionHistory.bin b/.gradle/7.3.3/executionHistory/executionHistory.bin index c9812a2..f1b59b6 100644 Binary files a/.gradle/7.3.3/executionHistory/executionHistory.bin and b/.gradle/7.3.3/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.3.3/executionHistory/executionHistory.lock b/.gradle/7.3.3/executionHistory/executionHistory.lock index 7c7befb..fc40dd4 100644 Binary files a/.gradle/7.3.3/executionHistory/executionHistory.lock and b/.gradle/7.3.3/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.3.3/fileHashes/fileHashes.bin b/.gradle/7.3.3/fileHashes/fileHashes.bin index 118013a..5544de6 100644 Binary files a/.gradle/7.3.3/fileHashes/fileHashes.bin and b/.gradle/7.3.3/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.3.3/fileHashes/fileHashes.lock b/.gradle/7.3.3/fileHashes/fileHashes.lock index a875477..61cacda 100644 Binary files a/.gradle/7.3.3/fileHashes/fileHashes.lock and b/.gradle/7.3.3/fileHashes/fileHashes.lock differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index c3ad868..c2e5c55 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 8d31e07..36a9e6b 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index ce1a5fd..4bbf1ef 100644 Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ diff --git a/build.gradle b/build.gradle index f9f2c5a..3f24ddc 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'io.github.simplex' -version = 'Alpha-1.0-RC03' +version = 'Alpha-1.0' repositories { mavenCentral() diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index b08b0d5..84e4304 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -1,5 +1,5 @@ name: FeelingLucky -version: 'Alpha-1.0-RC03' +version: 'Alpha-1.0' author: SimplexDevelopment main: io.github.simplex.luck.FeelingLucky api-version: 1.18 diff --git a/src/main/java/io/github/simplex/lib/ItemBuilder.java b/src/main/java/io/github/simplex/lib/ItemBuilder.java new file mode 100644 index 0000000..8e3a3f0 --- /dev/null +++ b/src/main/java/io/github/simplex/lib/ItemBuilder.java @@ -0,0 +1,62 @@ +package io.github.simplex.lib; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.Contract; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public final class ItemBuilder { + private final ItemStack stack; + private final ItemMeta meta; + + public ItemBuilder(Material material) { + this.stack = new ItemStack(material); + this.meta = stack.getItemMeta(); + } + + @Contract("_ -> new") + public static ItemBuilder of(Material material) { + return new ItemBuilder(material); + } + + public ItemBuilder setName(String name) { + meta.displayName(MiniComponent.of(name).send()); + return this; + } + + public ItemBuilder setAmount(int amount) { + stack.setAmount(amount); + return this; + } + + public ItemBuilder setLore(String... lore) { + List components = new ArrayList<>(); + Arrays.stream(lore).forEach(entry -> components.add(MiniComponent.of(entry).send())); + meta.lore(components); + return this; + } + + public ItemStack build() { + stack.setItemMeta(meta); + return stack; + } + + private Component component(String content, TextColor color, TextDecoration decoration) { + return Component.empty().content(content).decorate(decoration).color(color); + } + + private Component component(String content, TextColor color) { + return Component.empty().content(content).color(color); + } + + private Component component(String content) { + return Component.empty().content(content); + } +} diff --git a/src/main/java/io/github/simplex/lib/Messages.java b/src/main/java/io/github/simplex/lib/Messages.java index 35e3825..81725ee 100644 --- a/src/main/java/io/github/simplex/lib/Messages.java +++ b/src/main/java/io/github/simplex/lib/Messages.java @@ -3,13 +3,15 @@ package io.github.simplex.lib; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public enum Messages { - NOT_FROM_CONSOLE(builder("This command may only be used in game.", null, null)), - NO_PERMISSION(builder("You do not have permission to use this command.", TextColor.color(255, 0, 0), TextDecoration.ITALIC)); + NOT_FROM_CONSOLE(MiniComponent.of("This command may only be used in game.").send()), + NO_PERMISSION(MiniComponent + .of("You do not have permission to use this command.") + .color(TextColor.color(255, 0, 0)) + .decorate(TextDecoration.ITALIC) + .send()); private final Component message; @@ -20,16 +22,4 @@ public enum Messages { public Component get() { return message; } - - private static Component builder(@NotNull String message, @Nullable TextColor color, @Nullable TextDecoration decoration) { - if (color == null) { - if (decoration == null) return Component.empty().content(message); - - return Component.empty().content(message).decoration(decoration, TextDecoration.State.TRUE); - } - - if (decoration == null) return Component.empty().content(message).color(color); - - return Component.empty().content(message).color(color).decoration(decoration, TextDecoration.State.TRUE); - } } diff --git a/src/main/java/io/github/simplex/lib/MiniComponent.java b/src/main/java/io/github/simplex/lib/MiniComponent.java new file mode 100644 index 0000000..0ffbeec --- /dev/null +++ b/src/main/java/io/github/simplex/lib/MiniComponent.java @@ -0,0 +1,43 @@ +package io.github.simplex.lib; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.jetbrains.annotations.Contract; + +public class MiniComponent { + private final String content; + private TextDecoration decoration = null; + private TextColor color = null; + + @Contract("_ -> new") + public static MiniComponent of(String content) { + return new MiniComponent(content); + } + + public MiniComponent(String content) { + this.content = content; + } + + public MiniComponent decorate(TextDecoration decoration) { + this.decoration = decoration; + return this; + } + + public MiniComponent color(TextColor color) { + this.color = color; + return this; + } + + public Component send() { + if (color == null) { + if (decoration == null) return Component.empty().content(content); + + return Component.empty().content(content).decoration(decoration, TextDecoration.State.TRUE); + } + + if (decoration == null) return Component.empty().content(content).color(color); + + return Component.empty().content(content).decorate(decoration).color(color); + } +} diff --git a/src/main/java/io/github/simplex/luck/FeelingLucky.java b/src/main/java/io/github/simplex/luck/FeelingLucky.java index fdca6a2..8b7c0a7 100644 --- a/src/main/java/io/github/simplex/luck/FeelingLucky.java +++ b/src/main/java/io/github/simplex/luck/FeelingLucky.java @@ -3,6 +3,7 @@ package io.github.simplex.luck; import io.github.simplex.luck.listener.*; import io.github.simplex.luck.player.PlayerConfig; import io.github.simplex.luck.player.PlayerHandler; +import io.github.simplex.luck.util.LuckCMD; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -33,6 +34,7 @@ public final class FeelingLucky extends JavaPlugin { new TakeDamage(this); new RestoreHunger(this); new EnchantmentBoost(this); + new ExpBoost(this); getLogger().info("Registration complete! Attempting to load all player configuration files..."); File[] files = getDataFolder().listFiles(); diff --git a/src/main/java/io/github/simplex/luck/listener/BlockDrops.java b/src/main/java/io/github/simplex/luck/listener/BlockDrops.java index 73e236b..13f1b30 100644 --- a/src/main/java/io/github/simplex/luck/listener/BlockDrops.java +++ b/src/main/java/io/github/simplex/luck/listener/BlockDrops.java @@ -1,9 +1,8 @@ package io.github.simplex.luck.listener; import io.github.simplex.luck.FeelingLucky; -import io.github.simplex.luck.SneakyWorker; +import io.github.simplex.luck.util.SneakyWorker; import io.github.simplex.luck.player.Luck; -import org.bukkit.Bukkit; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/io/github/simplex/luck/listener/ExpBoost.java b/src/main/java/io/github/simplex/luck/listener/ExpBoost.java new file mode 100644 index 0000000..6fc8c40 --- /dev/null +++ b/src/main/java/io/github/simplex/luck/listener/ExpBoost.java @@ -0,0 +1,29 @@ +package io.github.simplex.luck.listener; + +import com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent; +import io.github.simplex.luck.FeelingLucky; +import io.github.simplex.luck.player.Luck; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public record ExpBoost(FeelingLucky plugin) implements Listener { + public ExpBoost(FeelingLucky plugin) { + this.plugin = plugin; + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void boostExperienceGain(PlayerPickupExperienceEvent event) { + ExperienceOrb orb = event.getExperienceOrb(); + int n = orb.getExperience(); + int math = (5 * n ^ 2) / (2 * n + 4); + int rounded = Math.round(math); + Player player = event.getPlayer(); + Luck luck = plugin.handler.getLuckContainer(player); + if (luck.quickRNG(luck.getPercentage())) { + orb.setExperience(rounded); + } + } +} diff --git a/src/main/java/io/github/simplex/luck/listener/PlayerListener.java b/src/main/java/io/github/simplex/luck/listener/PlayerListener.java index 30c31eb..8ba28aa 100644 --- a/src/main/java/io/github/simplex/luck/listener/PlayerListener.java +++ b/src/main/java/io/github/simplex/luck/listener/PlayerListener.java @@ -2,6 +2,7 @@ package io.github.simplex.luck.listener; import io.github.simplex.luck.FeelingLucky; import io.github.simplex.luck.player.Luck; +import io.github.simplex.luck.util.SpecialFootItem; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -26,9 +27,13 @@ public record PlayerListener(FeelingLucky plugin) implements Listener { public void rabbitFoot(PlayerInteractEvent event) { Action action = event.getAction(); ItemStack foot = new ItemStack(Material.RABBIT_FOOT); + SpecialFootItem special = new SpecialFootItem(); Player player = event.getPlayer(); Luck luck = plugin.handler.getLuckContainer(player); if (action.isRightClick() && player.getInventory().getItemInMainHand().isSimilar(foot)) { + if (foot.getItemMeta().equals(special.meta()) || foot.equals(special.get())) { + luck.setMultiplier(luck.multiplier() + 1); + } double rng = Luck.RNG().nextDouble(2.0, 5.0); player.getInventory().remove(player.getInventory().getItemInMainHand()); luck.addTo(rng); diff --git a/src/main/java/io/github/simplex/luck/listener/RestoreHunger.java b/src/main/java/io/github/simplex/luck/listener/RestoreHunger.java index f8cd802..4d9d7d9 100644 --- a/src/main/java/io/github/simplex/luck/listener/RestoreHunger.java +++ b/src/main/java/io/github/simplex/luck/listener/RestoreHunger.java @@ -2,9 +2,8 @@ package io.github.simplex.luck.listener; import io.github.simplex.lib.PotionEffectBuilder; import io.github.simplex.luck.FeelingLucky; -import io.github.simplex.luck.ListBox; +import io.github.simplex.luck.util.ListBox; import io.github.simplex.luck.player.Luck; -import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerItemConsumeEvent; diff --git a/src/main/java/io/github/simplex/luck/listener/TakeDamage.java b/src/main/java/io/github/simplex/luck/listener/TakeDamage.java index 5474faa..92cd9c6 100644 --- a/src/main/java/io/github/simplex/luck/listener/TakeDamage.java +++ b/src/main/java/io/github/simplex/luck/listener/TakeDamage.java @@ -2,10 +2,9 @@ package io.github.simplex.luck.listener; import io.github.simplex.lib.PotionEffectBuilder; import io.github.simplex.luck.FeelingLucky; -import io.github.simplex.luck.ListBox; +import io.github.simplex.luck.util.ListBox; import io.github.simplex.luck.player.Luck; import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/io/github/simplex/luck/player/Luck.java b/src/main/java/io/github/simplex/luck/player/Luck.java index 07746b8..d6ea785 100644 --- a/src/main/java/io/github/simplex/luck/player/Luck.java +++ b/src/main/java/io/github/simplex/luck/player/Luck.java @@ -15,11 +15,11 @@ import java.util.SplittableRandom; @SuppressWarnings("all") public class Luck implements LuckContainer { private final Player player; - private final double multiplier; private final PlayerLuckChangeEvent event; private final FeelingLucky plugin; private final List markedPlayers = new ArrayList<>(); private double BASE_VALUE; + private double multiplier; public Luck(FeelingLucky plugin, Player player) { this(plugin, player, 1.0); @@ -132,6 +132,11 @@ public class Luck implements LuckContainer { Bukkit.getPluginManager().callEvent(event); } + public void setMultiplier(double multiplier) { + this.multiplier = multiplier; + plugin.getConfigMap().get(associatedPlayer().getUniqueId()).setMultiplier(multiplier); + } + public double getDefaultValue() { return player.getAttribute(Attribute.GENERIC_LUCK).getDefaultValue(); } diff --git a/src/main/java/io/github/simplex/luck/player/PlayerConfig.java b/src/main/java/io/github/simplex/luck/player/PlayerConfig.java index b835858..b200876 100644 --- a/src/main/java/io/github/simplex/luck/player/PlayerConfig.java +++ b/src/main/java/io/github/simplex/luck/player/PlayerConfig.java @@ -1,7 +1,7 @@ package io.github.simplex.luck.player; import io.github.simplex.luck.FeelingLucky; -import io.github.simplex.luck.SneakyWorker; +import io.github.simplex.luck.util.SneakyWorker; import org.bukkit.attribute.Attribute; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -50,9 +50,6 @@ public class PlayerConfig { config.set("luck", plugin.handler.getLuckContainer(player).getDefaultValue()); config.set("multiplier", "1.0"); save(); - } else if (!tempUsername.equalsIgnoreCase(player.getName())) { - config.set("username", player.getName()); - save(); } } @@ -80,11 +77,21 @@ public class PlayerConfig { load(); } + public void setUsername(String name) { + config.set("username", name); + save(); + } + public void setLuck(double luck) { config.set("luck", luck); save(); } + public void setMultiplier(double multiplier) { + config.set("multiplier", multiplier); + save(); + } + public YamlConfiguration getConfig() { return config; } diff --git a/src/main/java/io/github/simplex/luck/ListBox.java b/src/main/java/io/github/simplex/luck/util/ListBox.java similarity index 98% rename from src/main/java/io/github/simplex/luck/ListBox.java rename to src/main/java/io/github/simplex/luck/util/ListBox.java index 45833fd..3b78105 100644 --- a/src/main/java/io/github/simplex/luck/ListBox.java +++ b/src/main/java/io/github/simplex/luck/util/ListBox.java @@ -1,4 +1,4 @@ -package io.github.simplex.luck; +package io.github.simplex.luck.util; import org.bukkit.Material; import org.bukkit.event.entity.EntityDamageEvent; diff --git a/src/main/java/io/github/simplex/luck/LuckCMD.java b/src/main/java/io/github/simplex/luck/util/LuckCMD.java similarity index 98% rename from src/main/java/io/github/simplex/luck/LuckCMD.java rename to src/main/java/io/github/simplex/luck/util/LuckCMD.java index 1f2e0b4..122f4a7 100644 --- a/src/main/java/io/github/simplex/luck/LuckCMD.java +++ b/src/main/java/io/github/simplex/luck/util/LuckCMD.java @@ -1,6 +1,7 @@ -package io.github.simplex.luck; +package io.github.simplex.luck.util; import io.github.simplex.lib.Messages; +import io.github.simplex.luck.FeelingLucky; import io.github.simplex.luck.player.Luck; import io.github.simplex.luck.player.PlayerConfig; import net.kyori.adventure.text.Component; diff --git a/src/main/java/io/github/simplex/luck/SneakyWorker.java b/src/main/java/io/github/simplex/luck/util/SneakyWorker.java similarity index 96% rename from src/main/java/io/github/simplex/luck/SneakyWorker.java rename to src/main/java/io/github/simplex/luck/util/SneakyWorker.java index f2f7aba..4fcf643 100644 --- a/src/main/java/io/github/simplex/luck/SneakyWorker.java +++ b/src/main/java/io/github/simplex/luck/util/SneakyWorker.java @@ -1,4 +1,4 @@ -package io.github.simplex.luck; +package io.github.simplex.luck.util; import io.github.simplex.luck.player.Luck; import org.bukkit.Bukkit; diff --git a/src/main/java/io/github/simplex/luck/util/SpecialFootItem.java b/src/main/java/io/github/simplex/luck/util/SpecialFootItem.java new file mode 100644 index 0000000..4f220bf --- /dev/null +++ b/src/main/java/io/github/simplex/luck/util/SpecialFootItem.java @@ -0,0 +1,26 @@ +package io.github.simplex.luck.util; + +import io.github.simplex.lib.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class SpecialFootItem { + public final ItemStack stack; + + public SpecialFootItem() { + stack = ItemBuilder.of(Material.RABBIT_FOOT) + .setName("Enhanced Rabbit Foot") + .setAmount(1).setLore("A strange energy radiates from within.", + "This item will increase your luck multiplier by one.") + .build(); + } + + public ItemStack get() { + return stack; + } + + public ItemMeta meta() { + return stack.getItemMeta(); + } +}