From aee3bcaecfbbc2a96fecadef3e1a90342c1fd01b Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sun, 29 Dec 2024 18:45:25 +0300 Subject: [PATCH] vault --- .../java/ru/themixray/itemeconomy/Config.java | 17 ++ .../java/ru/themixray/itemeconomy/Main.java | 29 +- .../themixray/itemeconomy/UnrealConfig.java | 67 ++++ .../ru/themixray/itemeconomy/VaultLayer.java | 287 ++++++++++++++++++ src/main/resources/config.yml | 5 + 5 files changed, 403 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/themixray/itemeconomy/Config.java create mode 100755 src/main/java/ru/themixray/itemeconomy/UnrealConfig.java create mode 100644 src/main/java/ru/themixray/itemeconomy/VaultLayer.java create mode 100644 src/main/resources/config.yml diff --git a/src/main/java/ru/themixray/itemeconomy/Config.java b/src/main/java/ru/themixray/itemeconomy/Config.java new file mode 100644 index 0000000..6925f44 --- /dev/null +++ b/src/main/java/ru/themixray/itemeconomy/Config.java @@ -0,0 +1,17 @@ +package ru.themixray.itemeconomy; + +import org.bukkit.Material; + +public class Config { + public static Material ITEM; + public static String FORMAT; + public static String PLURAL; + public static String SINGULAR; + + public static void loadConfig(UnrealConfig conf) { + ITEM = Material.valueOf(((String) conf.get("item")).toUpperCase()); + FORMAT = (String) conf.get("format"); + PLURAL = (String) conf.get("plural"); + SINGULAR = (String) conf.get("singular"); + } +} diff --git a/src/main/java/ru/themixray/itemeconomy/Main.java b/src/main/java/ru/themixray/itemeconomy/Main.java index aacde82..568ed59 100644 --- a/src/main/java/ru/themixray/itemeconomy/Main.java +++ b/src/main/java/ru/themixray/itemeconomy/Main.java @@ -1,16 +1,41 @@ package ru.themixray.itemeconomy; +import com.google.common.io.ByteArrayDataInput; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; -public class Main extends JavaPlugin { +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +public class Main extends JavaPlugin { @Override public void onEnable() { - super.onEnable(); + Config.loadConfig(new UnrealConfig(this, getDataFolder(), "config.yml")); } @Override public void onDisable() { super.onDisable(); } + + public static List getInventory(Player player) { + return Arrays.stream(player.getInventory().getContents()).map(o -> o == null ? new ItemStack(Material.AIR) : o).toList(); + } + + public static boolean removeItems(Player player, Material type, int amount) { + if(player.getInventory().all(type).values().stream().mapToInt(ItemStack::getAmount).sum() nope=player.getInventory().addItem(new ItemStack(type,amount)); + for(ItemStack v:nope.values())player.getWorld().dropItemNaturally(player.getLocation(),v); + } } \ No newline at end of file diff --git a/src/main/java/ru/themixray/itemeconomy/UnrealConfig.java b/src/main/java/ru/themixray/itemeconomy/UnrealConfig.java new file mode 100755 index 0000000..36896dc --- /dev/null +++ b/src/main/java/ru/themixray/itemeconomy/UnrealConfig.java @@ -0,0 +1,67 @@ +package ru.themixray.itemeconomy; + +import org.yaml.snakeyaml.Yaml; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +public class UnrealConfig extends HashMap { + private static final Yaml yaml = new Yaml(); + + private final File file; + + public UnrealConfig(Object plugin, File dataDirectory, String filename) { + this(plugin, dataDirectory.toPath(), filename, filename); + } + + public UnrealConfig(Object plugin, File dataDirectory, String filename, String default_filename) { + this(plugin, dataDirectory.toPath(), filename, default_filename); + } + + public UnrealConfig(Object plugin, Path dataDirectory, String filename) { + this(plugin, dataDirectory, filename, filename); + } + + public UnrealConfig(Object plugin, Path dataDirectory, String filename, String default_filename) { + file = Paths.get(dataDirectory.toFile().getPath(), filename).toFile(); + + if (!dataDirectory.toFile().exists()) { + dataDirectory.toFile().mkdir(); + } + + if (!file.exists()) { + try (InputStream stream = plugin.getClass().getClassLoader().getResourceAsStream(default_filename)) { + assert stream != null; + Files.copy(stream, file.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + reload(); + } + + public void reload() { + try { + clear(); + putAll(yaml.load(new FileInputStream(file))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public void save() { + try { + yaml.dump(this,new FileWriter(file)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Map clone() { + return new HashMap<>(this); + } +} diff --git a/src/main/java/ru/themixray/itemeconomy/VaultLayer.java b/src/main/java/ru/themixray/itemeconomy/VaultLayer.java new file mode 100644 index 0000000..b49ccb4 --- /dev/null +++ b/src/main/java/ru/themixray/itemeconomy/VaultLayer.java @@ -0,0 +1,287 @@ +package ru.themixray.itemeconomy; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.economy.EconomyResponse; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; +import java.util.Objects; + +public class VaultLayer implements Economy { + @Override + public boolean isEnabled() { + return true; + } + + @Override + public String getName() { + return "ItemEconomy"; + } + + @Override + public boolean hasBankSupport() { + return false; + } + + @Override + public int fractionalDigits() { + return 0; + } + + @Override + public String format(double amount) { + return Config.FORMAT.replace("{}", String.valueOf(amount)); + } + + @Override + public String currencyNamePlural() { + return Config.PLURAL; + } + + @Override + public String currencyNameSingular() { + return Config.SINGULAR; + } + + @Override + public boolean hasAccount(String playerName) { + return Bukkit.getPlayer(playerName) != null; + } + + @Override + public double getBalance(String playerName) { + Player player = Bukkit.getPlayer(playerName); + if (player != null) { + return Main.getInventory(player).stream() + .filter(Objects::nonNull) + .filter(i -> i.getType().equals(Config.ITEM)) + .mapToInt(ItemStack::getAmount) + .sum(); + } else { + return 0; + } + } + + @Override + public boolean has(String playerName, double amount) { + return getBalance(playerName) >= amount; + } + + @Override + public EconomyResponse withdrawPlayer(String playerName, double amount) { + if (amount == 0) return new EconomyResponse(amount,getBalance(playerName),EconomyResponse.ResponseType.SUCCESS,null); + if (amount < 0) return depositPlayer(playerName,-amount); + + if (!has(playerName, amount)) + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.FAILURE, + "Недостаточно средств"); + + Player player; + if ((player = Bukkit.getPlayer(playerName)) == null) { + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.FAILURE, + "Игрок офлайн"); + } + + if (!Main.removeItems(player, Config.ITEM, (int) amount)) { + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.FAILURE, + "Недостаточно средств"); + } + + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.SUCCESS, + null); + } + + @Override + public EconomyResponse depositPlayer(String playerName, double amount) { + if (amount == 0) return new EconomyResponse(amount,getBalance(playerName),EconomyResponse.ResponseType.SUCCESS,null); + if (amount < 0) return withdrawPlayer(playerName,-amount); + + Player player; + if ((player = Bukkit.getPlayer(playerName)) == null) { + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.FAILURE, + "Игрок офлайн"); + } + + Main.addItems(player, Config.ITEM, (int) amount); + + return new EconomyResponse( + amount, + getBalance(playerName), + EconomyResponse.ResponseType.SUCCESS, + null); + } + + @Override + public boolean hasAccount(OfflinePlayer player) { + return hasAccount(player.getName()); + } + + @Override + public boolean hasAccount(String playerName, String worldName) { + return hasAccount(playerName); + } + + @Override + public boolean hasAccount(OfflinePlayer player, String worldName) { + return hasAccount(player.getName()); + } + + @Override + public double getBalance(OfflinePlayer player) { + return getBalance(player.getName()); + } + + @Override + public double getBalance(String playerName, String world) { + return getBalance(playerName); + } + + @Override + public double getBalance(OfflinePlayer player, String world) { + return getBalance(player.getName()); + } + + @Override + public boolean has(OfflinePlayer player, double amount) { + return has(player.getName(), amount); + } + + @Override + public boolean has(String playerName, String worldName, double amount) { + return has(playerName, amount); + } + + @Override + public boolean has(OfflinePlayer player, String worldName, double amount) { + return has(player.getName(), amount); + } + + @Override + public EconomyResponse withdrawPlayer(OfflinePlayer player, double amount) { + return withdrawPlayer(player.getName(), amount); + } + + @Override + public EconomyResponse withdrawPlayer(String playerName, String worldName, double amount) { + return withdrawPlayer(playerName, amount); + } + + @Override + public EconomyResponse withdrawPlayer(OfflinePlayer player, String worldName, double amount) { + return withdrawPlayer(player.getName(), amount); + } + + @Override + public EconomyResponse depositPlayer(OfflinePlayer player, double amount) { + return depositPlayer(player.getName(), amount); + } + + @Override + public EconomyResponse depositPlayer(String playerName, String worldName, double amount) { + return depositPlayer(playerName, amount); + } + + @Override + public EconomyResponse depositPlayer(OfflinePlayer player, String worldName, double amount) { + return depositPlayer(player.getName(), amount); + } + + @Override + public EconomyResponse createBank(String name, String player) { + return null; + } + + @Override + public EconomyResponse createBank(String name, OfflinePlayer player) { + return null; + } + + @Override + public EconomyResponse deleteBank(String name) { + return null; + } + + @Override + public EconomyResponse bankBalance(String name) { + return null; + } + + @Override + public EconomyResponse bankHas(String name, double amount) { + return null; + } + + @Override + public EconomyResponse bankWithdraw(String name, double amount) { + return null; + } + + @Override + public EconomyResponse bankDeposit(String name, double amount) { + return null; + } + + @Override + public EconomyResponse isBankOwner(String name, String playerName) { + return null; + } + + @Override + public EconomyResponse isBankOwner(String name, OfflinePlayer player) { + return null; + } + + @Override + public EconomyResponse isBankMember(String name, String playerName) { + return null; + } + + @Override + public EconomyResponse isBankMember(String name, OfflinePlayer player) { + return null; + } + + @Override + public List getBanks() { + return List.of(); + } + + @Override + public boolean createPlayerAccount(String playerName) { + return false; + } + + @Override + public boolean createPlayerAccount(OfflinePlayer player) { + return false; + } + + @Override + public boolean createPlayerAccount(String playerName, String worldName) { + return false; + } + + @Override + public boolean createPlayerAccount(OfflinePlayer player, String worldName) { + return false; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..5e033c4 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,5 @@ +item: "diamond" + +format: "{}$" +plural: "алмазы" +singular: "алмаз" \ No newline at end of file