This commit is contained in:
Paldiu 2022-03-20 13:09:24 -05:00
parent dcd7f7401c
commit 831913c668
14 changed files with 232 additions and 159 deletions

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,41 +0,0 @@
package io.github.simplex.crumb;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
public class Config extends YamlConfiguration {
private final String CONFIG_NAME = "config.yml";
private final File dataFolder;
private final Crumb plugin;
private final File configFile;
@SuppressWarnings("ResultOfMethodCallIgnored")
public Config(Crumb plugin, boolean copyResource) {
this.plugin = plugin;
this.dataFolder = plugin.getDataFolder();
if (!dataFolder.exists()) dataFolder.mkdirs();
File file = new File(dataFolder, CONFIG_NAME);
if (!file.exists()) {
SneakyWorker.sneakyTry(() -> {
file.createNewFile();
plugin.saveResource(CONFIG_NAME, true);
});
}
if (copyResource) plugin.saveResource(CONFIG_NAME, true);
configFile = file;
loadConfiguration(configFile);
}
public void save() {
SneakyWorker.sneakyTry(() -> super.save(configFile));
}
public void load() {
SneakyWorker.sneakyTry(() -> {
super.load(configFile);
});
}
}

View File

@ -1,21 +0,0 @@
package io.github.simplex.crumb;
import org.bukkit.plugin.java.JavaPlugin;
public final class Crumb extends JavaPlugin {
public Config config;
public PlayerHandler handler;
@Override
public void onEnable() {
config = new Config(this, false);
handler = new PlayerHandler(this);
this.getServer().getPluginManager().registerEvents(handler, this);
}
@Override
public void onDisable() {
config.save();
// Plugin shutdown logic
}
}

View File

@ -1,58 +0,0 @@
package io.github.simplex.crumb;
import org.bukkit.attribute.Attribute;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PlayerHandler implements Listener {
private final Map<Player, Luck> playerLuckMap = new HashMap<>();
private final List<Player> markedPlayers = new ArrayList<>();
private final Crumb plugin;
public PlayerHandler(Crumb plugin) {
this.plugin = plugin;
}
public Luck getLuckContainer(Player player) {
return playerLuckMap.get(player);
}
@EventHandler
public void initializePlayer(PlayerLoginEvent event) {
Player player = event.getPlayer();
String uuid = player.getUniqueId().toString();
ConfigurationSection identifier = plugin.config.getConfigurationSection(uuid);
Luck luck = new Luck(player);
if (identifier == null) {
identifier = plugin.config.createSection(player.getUniqueId().toString());
identifier.set("luck", luck.defaultValue());
plugin.config.save();
}
luck.setValue(identifier.getDouble("luck"));
playerLuckMap.put(player, luck);
}
public void updatePlayer(Player player, Luck luck) {
playerLuckMap.replace(player, luck);
}
public void markPlayer(Player player) {
markedPlayers.add(player);
}
public void unmarkPlayer(Player player) {
markedPlayers.remove(player);
}
public boolean isMarked(Player player) {
return markedPlayers.contains(player);
}
}

View File

@ -1,17 +0,0 @@
package io.github.simplex.crumb;
import org.bukkit.Bukkit;
public class SneakyWorker {
public static void sneakyTry(SneakyTry sneakyTry) {
try {
sneakyTry.tryThis();
} catch (Exception ex) {
Bukkit.getLogger().severe(ex.getMessage());
}
}
interface SneakyTry {
void tryThis() throws Exception;
}
}

View File

@ -0,0 +1,29 @@
package io.github.simplex.luck;
import io.github.simplex.luck.player.PlayerConfig;
import io.github.simplex.luck.player.PlayerHandler;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
import java.util.List;
public final class FeelingLucky extends JavaPlugin {
public PlayerHandler handler;
private static final List<PlayerConfig> configList = new ArrayList<>();
@Override
public void onEnable() {
handler = new PlayerHandler(this);
configList.forEach(PlayerConfig::load);
this.getServer().getPluginManager().registerEvents(handler, this);
}
@Override
public void onDisable() {
configList.forEach(PlayerConfig::save);
}
public static List<PlayerConfig> getConfigList() {
return configList;
}
}

View File

@ -0,0 +1,21 @@
package io.github.simplex.luck;
import org.bukkit.Bukkit;
public class SneakyWorker {
public static void sneakyTry(SneakyTry sneakyTry) {
try {
sneakyTry.tryThis();
} catch (Exception ex) {
String sb = "An error of type: "
+ ex.getClass().getSimpleName()
+ " has occurred. A cause will be printed. \n\n"
+ ex.getCause();
Bukkit.getLogger().severe(sb);
}
}
public interface SneakyTry {
void tryThis() throws Exception;
}
}

View File

@ -1,10 +1,10 @@
package io.github.simplex.crumb.listener; package io.github.simplex.luck.listener;
import io.github.simplex.crumb.Crumb; import io.github.simplex.luck.FeelingLucky;
import io.github.simplex.crumb.Luck; import io.github.simplex.luck.player.Luck;
import io.github.simplex.luck.player.PlayerHandler;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Witch; import org.bukkit.entity.Witch;
@ -23,9 +23,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class PlayerListener implements Listener { public class PlayerListener implements Listener {
private final Crumb plugin; private final FeelingLucky plugin;
public PlayerListener(Crumb plugin) { public PlayerListener(FeelingLucky plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
@ -36,9 +36,9 @@ public class PlayerListener implements Listener {
return; return;
} }
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
Luck luck = plugin.handler.getLuckContainer(player); Luck luck = PlayerHandler.getLuckContainer(player);
if (ListBox.acceptedCauses.contains(event.getCause())) { if (ListBox.acceptedCauses.contains(event.getCause())) {
if (!luck.isDefault()) { if (luck.notDefault()) {
double percentage = luck.getPercentage(); double percentage = luck.getPercentage();
if (luck.quickRNG(percentage)) { if (luck.quickRNG(percentage)) {
event.setCancelled(true); event.setCancelled(true);
@ -49,7 +49,7 @@ public class PlayerListener implements Listener {
} }
if (ListBox.sideCauses.contains(event.getCause())) { if (ListBox.sideCauses.contains(event.getCause())) {
if (!luck.isDefault()) { if (luck.notDefault()) {
double percentage = luck.getPercentage(); double percentage = luck.getPercentage();
if (luck.quickRNG(percentage)) { if (luck.quickRNG(percentage)) {
event.setCancelled(true); event.setCancelled(true);
@ -64,8 +64,8 @@ public class PlayerListener implements Listener {
@EventHandler @EventHandler
public void restoreHunger(PlayerItemConsumeEvent event) { public void restoreHunger(PlayerItemConsumeEvent event) {
ItemStack item = event.getItem(); ItemStack item = event.getItem();
Luck luck = plugin.handler.getLuckContainer(event.getPlayer()); Luck luck = PlayerHandler.getLuckContainer(event.getPlayer());
if (!luck.isDefault()) { if (luck.notDefault()) {
double percentage = luck.getPercentage(); double percentage = luck.getPercentage();
ListBox.foods.forEach(food -> { ListBox.foods.forEach(food -> {
if (item.isSimilar(food)) { if (item.isSimilar(food)) {
@ -82,7 +82,7 @@ public class PlayerListener implements Listener {
Action action = event.getAction(); Action action = event.getAction();
ItemStack foot = new ItemStack(Material.RABBIT_FOOT); ItemStack foot = new ItemStack(Material.RABBIT_FOOT);
Player player = event.getPlayer(); Player player = event.getPlayer();
Luck luck = plugin.handler.getLuckContainer(player); Luck luck = PlayerHandler.getLuckContainer(player);
if (action.isRightClick() && player.getInventory().getItemInMainHand().isSimilar(foot)) { if (action.isRightClick() && player.getInventory().getItemInMainHand().isSimilar(foot)) {
double rng = luck.RNG().nextDouble(2.0, 5.0); double rng = luck.RNG().nextDouble(2.0, 5.0);
player.getInventory().remove(player.getInventory().getItemInMainHand()); player.getInventory().remove(player.getInventory().getItemInMainHand());
@ -106,7 +106,7 @@ public class PlayerListener implements Listener {
return; return;
} }
Luck luck = plugin.handler.getLuckContainer(player); Luck luck = PlayerHandler.getLuckContainer(player);
if (cause.equals(DamageCause.MAGIC) || cause.equals(DamageCause.POISON)) { if (cause.equals(DamageCause.MAGIC) || cause.equals(DamageCause.POISON)) {
if (luck.quickRNG(33.0)) { if (luck.quickRNG(33.0)) {
luck.takeFrom(5.0); luck.takeFrom(5.0);

View File

@ -1,6 +1,7 @@
package io.github.simplex.crumb; package io.github.simplex.luck.player;
import io.github.simplex.api.LuckContainer; import io.github.simplex.api.LuckContainer;
import org.bukkit.Bukkit;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -10,17 +11,17 @@ public class Luck implements LuckContainer {
private final Player player; private final Player player;
private final double multiplier; private final double multiplier;
private final double BASE_VALUE; private final double BASE_VALUE;
private final PlayerLuckChangeEvent event;
public Luck(Player player) { public Luck(Player player) {
this.player = player; this(player, 1.0);
multiplier = 1.0;
BASE_VALUE = player.getAttribute(Attribute.GENERIC_LUCK).getDefaultValue();
} }
public Luck(Player player, double multiplier) { public Luck(Player player, double multiplier) {
this.player = player; this.player = player;
this.multiplier = multiplier; this.multiplier = multiplier;
BASE_VALUE = player.getAttribute(Attribute.GENERIC_LUCK).getDefaultValue(); BASE_VALUE = player.getAttribute(Attribute.GENERIC_LUCK).getDefaultValue();
event = new PlayerLuckChangeEvent(player);
} }
@Override @Override
@ -66,7 +67,7 @@ public class Luck implements LuckContainer {
} }
if (multiplier() > 0.0) { if (multiplier() > 0.0) {
return (percentage >= (rng * multiplier())); return ((percentage * multiplier()) >= rng);
} }
return (percentage >= rng); return (percentage >= rng);
@ -83,22 +84,33 @@ public class Luck implements LuckContainer {
public void setValue(double value) { public void setValue(double value) {
player.getAttribute(Attribute.GENERIC_LUCK).setBaseValue(value); player.getAttribute(Attribute.GENERIC_LUCK).setBaseValue(value);
Bukkit.getPluginManager().callEvent(event);
} }
public void addTo(double value) { public void addTo(double value) {
setValue(baseValue() + value); setValue(baseValue() + value);
Bukkit.getPluginManager().callEvent(event);
} }
public void takeFrom(double value) { public void takeFrom(double value) {
setValue(baseValue() - value); setValue(baseValue() - value);
Bukkit.getPluginManager().callEvent(event);
} }
public double getPercentage() { public double getPercentage() {
return baseValue() - defaultValue(); return baseValue() - defaultValue();
} }
public boolean isDefault() { public boolean notDefault() {
return baseValue() == defaultValue(); return baseValue() != defaultValue();
}
public boolean lessThan(double value) {
return baseValue() < value;
}
public boolean greaterThan (double value) {
return baseValue() > value;
} }
@Override @Override

View File

@ -0,0 +1,51 @@
package io.github.simplex.luck.player;
import io.github.simplex.luck.FeelingLucky;
import io.github.simplex.luck.SneakyWorker;
import org.bukkit.attribute.Attribute;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
public class PlayerConfig extends YamlConfiguration {
private final File configFile;
private volatile YamlConfiguration config;
@SuppressWarnings("ResultOfMethodCallIgnored")
public PlayerConfig(FeelingLucky plugin, Player player) {
File dataFolder = new File(plugin.getDataFolder(), "players");
if (!dataFolder.exists()) dataFolder.mkdirs();
File file = new File(dataFolder, player.getUniqueId() + ".yml");
if (!file.exists()) {
SneakyWorker.sneakyTry(() -> {
file.createNewFile();
InputStreamReader reader = new InputStreamReader(plugin.getResource("default_player.yml"));
loadConfiguration(reader).save(file);
});
}
configFile = file;
config = loadConfiguration(configFile);
if (config.getString("username").equalsIgnoreCase("replace")) {
config.set("username", player.getName());
config.set("luck", new Luck(player).defaultValue());
config.set("multiplier", "1.0");
save();
}
}
public void save() {
SneakyWorker.sneakyTry(() -> config.save(configFile));
}
public void load() {
SneakyWorker.sneakyTry(() -> config = loadConfiguration(configFile));
}
public YamlConfiguration getConfig() {
return config;
}
}

View File

@ -0,0 +1,59 @@
package io.github.simplex.luck.player;
import io.github.simplex.luck.FeelingLucky;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public record PlayerHandler(FeelingLucky plugin) implements Listener {
private static final Map<Player, Luck> playerLuckMap = new HashMap<>();
private static final List<Player> markedPlayers = new ArrayList<>();
public static Luck getLuckContainer(Player player) {
return playerLuckMap.get(player);
}
@EventHandler
public void initializePlayer(PlayerLoginEvent event) {
Player player = event.getPlayer();
PlayerConfig config = new PlayerConfig(plugin, player);
String username = config.getString("username");
double luckstat = config.getDouble("luck");
double multiplier = config.getDouble("multiplier");
if (!player.getName().equalsIgnoreCase(username)) {
config.set("username", player.getName());
config.save();
config.load();
}
Luck luck = new Luck(player, multiplier);
luck.setValue(luckstat);
FeelingLucky.getConfigList().add(config);
playerLuckMap.put(player, luck);
}
public void updatePlayer(Player player, Luck luck) {
playerLuckMap.replace(player, luck);
}
public static void markPlayer(Player player) {
markedPlayers.add(player);
}
public static void unmarkPlayer(Player player) {
markedPlayers.remove(player);
}
public static boolean isMarked(Player player) {
return markedPlayers.contains(player);
}
}

View File

@ -0,0 +1,28 @@
package io.github.simplex.luck.player;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;
public class PlayerLuckChangeEvent extends PlayerEvent {
public final HandlerList handlerList = new HandlerList();
public PlayerLuckChangeEvent(@NotNull Player who) {
super(who);
Luck luck = PlayerHandler.getLuckContainer(who);
if (luck.lessThan(0.0) && !PlayerHandler.isMarked(who)) {
PlayerHandler.markPlayer(who);
return;
}
if (luck.greaterThan(0.0) && PlayerHandler.isMarked(who)) {
PlayerHandler.unmarkPlayer(who);
}
}
@Override
public @NotNull HandlerList getHandlers() {
return handlerList;
}
}

View File

@ -0,0 +1,3 @@
username: replace
luck: 0.0
multiplier: 1.0

View File

@ -1,4 +1,5 @@
name: Crumb name: FeelingLucky
version: '${version}' version: '${version}'
main: io.github.simplex.crumb.Crumb author: SimplexDevelopment
main: io.github.simplex.luck.FeelingLucky
api-version: 1.18 api-version: 1.18