diff --git a/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java b/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java index c2dde87..e3161f8 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java +++ b/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java @@ -25,10 +25,19 @@ import world.arainu.core.metaverseplugin.commands.CommandiPhone; import world.arainu.core.metaverseplugin.gui.Gui; import world.arainu.core.metaverseplugin.gui.MenuItem; -import world.arainu.core.metaverseplugin.iphone.*; -import world.arainu.core.metaverseplugin.listener.*; +import world.arainu.core.metaverseplugin.iphone.Bank; +import world.arainu.core.metaverseplugin.iphone.MoveSurvival; +import world.arainu.core.metaverseplugin.iphone.TrapTower; +import world.arainu.core.metaverseplugin.iphone.Worldteleport; +import world.arainu.core.metaverseplugin.iphone.iPhoneEnderDragon; +import world.arainu.core.metaverseplugin.listener.BankListener; +import world.arainu.core.metaverseplugin.listener.PublicListener; +import world.arainu.core.metaverseplugin.listener.ServerListener; +import world.arainu.core.metaverseplugin.listener.SittingListener; +import world.arainu.core.metaverseplugin.listener.VillagerListener; import world.arainu.core.metaverseplugin.scheduler.LateScheduler; import world.arainu.core.metaverseplugin.scheduler.MoneyScheduler; +import world.arainu.core.metaverseplugin.scheduler.SqlScheduler; import world.arainu.core.metaverseplugin.store.ServerStore; import world.arainu.core.metaverseplugin.store.iPhoneStore; import world.arainu.core.metaverseplugin.utils.sqlUtil; @@ -70,6 +79,7 @@ public void onEnable() { private void setScheduler() { new MoneyScheduler().runTaskTimer(this, 0, 20); new LateScheduler().runTaskTimer(this, 0, 20); + new SqlScheduler().runTaskTimer(this, 0, 60*60*2); createStairsYml(); } diff --git a/src/main/java/world/arainu/core/metaverseplugin/iphone/Bank.java b/src/main/java/world/arainu/core/metaverseplugin/iphone/Bank.java index e46ea43..dcb438d 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/iphone/Bank.java +++ b/src/main/java/world/arainu/core/metaverseplugin/iphone/Bank.java @@ -62,10 +62,11 @@ public static ItemStack getPluginMoneyEmerald(int yen, int quantity) { /** * アイテムがお金かどうか確認する関数 + * * @param item 対象のアイテム * @return お金かどうか */ - public static boolean isMoney(ItemStack item){ + public static boolean isMoney(ItemStack item) { return item.getItemMeta().getPersistentDataContainer().has(BankStore.getKey(), PersistentDataType.INTEGER); } @@ -76,13 +77,23 @@ public static boolean isMoney(ItemStack item){ * @param yen 換金する額 */ public static void addMoneyForPlayer(Player player, int yen) { + addMoneyForInventory(player.getInventory(), yen); + } + + /** + * 口座のお金を現金に換金する関数。 + * + * @param inv 対象のインベントリ + * @param yen 換金する額 + */ + public static void addMoneyForInventory(Inventory inv, int yen) { int log_money = (int) Math.log(yen); if (log_money > 5) { log_money = 5; } for (int i = log_money; i >= 0; i--) { ItemStack moneyStack = getPluginMoneyEmerald((int) Math.pow(10, i), (int) (yen / Math.pow(10, i))); - player.getInventory().addItem(moneyStack); + inv.addItem(moneyStack); yen %= (int) Math.pow(10, i); } } @@ -94,7 +105,7 @@ private void withdraw_Complete(Player player, String text, Economy econ, AtomicB throw new NumberFormatException(); } else if (econ.has(player, withdrawal_yen)) { econ.withdrawPlayer(player, withdrawal_yen); - ChatUtil.success(player,econ.format(withdrawal_yen) + "を正常に引き出しました。"); + ChatUtil.success(player, econ.format(withdrawal_yen) + "を正常に引き出しました。"); addMoneyForPlayer(player, withdrawal_yen); complete_flag.set(true); } else { @@ -112,7 +123,25 @@ private void payment_Complete(Player player, String text, AtomicBoolean complete throw new NumberFormatException(); } else { complete_flag.set(true); - Inventory inv = Bukkit.createInventory(null, 9, Component.text("入金したいお金を入れてください。")); + Inventory inv = Bukkit.createInventory(null, 27, Component.text("入金したいお金を入れてください。")); + final ItemStack partition = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); + ItemMeta itemMeta = partition.getItemMeta(); + itemMeta.displayName(Component.text("")); + partition.setItemMeta(itemMeta); + for (int i = 0; i < 9; i++) { + inv.setItem(i, partition); + } + final ItemStack price_item = new ItemStack(Material.EMERALD); + itemMeta = price_item.getItemMeta(); + itemMeta.displayName(Component.text("必要な金額:" + payment_yen)); + itemMeta.lore(Collections.singletonList(Component.text("クリックして入金").color(NamedTextColor.GRAY))); + price_item.setItemMeta(itemMeta); + inv.setItem(4, price_item); + final ItemStack move_all_item = new ItemStack(Material.GOLD_INGOT); + itemMeta = move_all_item.getItemMeta(); + itemMeta.displayName(Component.text("全額入金ボックスに移動させる").color(NamedTextColor.GOLD)); + move_all_item.setItemMeta(itemMeta); + inv.setItem(8, move_all_item); player.openInventory(inv); HashMap gui_hashmap = BankStore.getGui_hashmap(); gui_hashmap.put(player.getUniqueId(), payment_yen); @@ -138,7 +167,8 @@ private void remittance_Complete(Player player, String text, Economy econ, Atomi .responseHandler((form, responseData) -> { CustomFormResponse response = form.parseResponse(responseData); if (!response.isCorrect()) ChatUtil.warning(player, "お金の送金を取りやめました。"); - else remittance_Complete2(player, econ, remittance_yen, response.getInput(0), complete_flag_); + else + remittance_Complete2(player, econ, remittance_yen, response.getInput(0), complete_flag_); }); final FloodgatePlayer fPlayer = FloodgateApi.getInstance().getPlayer(player.getUniqueId()); fPlayer.sendForm(builder); @@ -170,7 +200,7 @@ private void remittance_Complete2(Player player, Economy econ, int remittance_ye if (econ.hasAccount(player_)) { econ.withdrawPlayer(player, remittance_yen); econ.depositPlayer(player_, remittance_yen); - ChatUtil.success(player,econ.format(remittance_yen) + "を" + player_.getName() + "に送金しました。"); + ChatUtil.success(player, econ.format(remittance_yen) + "を" + player_.getName() + "に送金しました。"); if (player_.isOnline()) { final Player player_online = (Player) player_; ChatUtil.success(player_online, (TextComponent) player.displayName() diff --git a/src/main/java/world/arainu/core/metaverseplugin/listener/BankListener.java b/src/main/java/world/arainu/core/metaverseplugin/listener/BankListener.java index 00e0e22..ecdae19 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/listener/BankListener.java +++ b/src/main/java/world/arainu/core/metaverseplugin/listener/BankListener.java @@ -1,5 +1,7 @@ package world.arainu.core.metaverseplugin.listener; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -14,8 +16,7 @@ import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; +import org.bukkit.inventory.meta.ItemMeta; import world.arainu.core.metaverseplugin.MetaversePlugin; import world.arainu.core.metaverseplugin.iphone.Bank; import world.arainu.core.metaverseplugin.store.BankStore; @@ -23,6 +24,7 @@ import world.arainu.core.metaverseplugin.utils.ChatUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -30,11 +32,13 @@ /** * 銀行に関するイベントをハンドリングしているクラス + * * @author kumitatepazuru */ public class BankListener implements Listener { /** * インベントリをクリックしたときに発火する関数 + * * @param e イベント */ @EventHandler @@ -42,48 +46,78 @@ public void onInventoryClick(InventoryClickEvent e) { Player p = (Player) e.getWhoClicked(); HashMap gui_hashmap = BankStore.getGui_hashmap(); if (BankStore.getGui_hashmap().containsKey(p.getUniqueId())) { - Bukkit.getScheduler().runTaskLater(MetaversePlugin.getInstance(), () -> { - Inventory inv = e.getInventory(); - List money_list = new ArrayList<>(inv.all(Material.EMERALD).values()); - int total_money = 0; - for (ItemStack i : money_list) { - if (Bank.isMoney(i)) { - final PersistentDataContainer persistentDataContainer = i.getItemMeta().getPersistentDataContainer(); - total_money += persistentDataContainer.get(BankStore.getKey(), PersistentDataType.INTEGER) * i.getAmount(); + final int id = e.getRawSlot(); + Inventory inv = e.getInventory(); + switch (id) { + case 4 -> { + e.setCancelled(true); + Bukkit.getScheduler().runTaskLater(MetaversePlugin.getInstance(), () -> { + final VillagerListener.ReturnMoney money = VillagerListener.getTotalmoney(inv); + final int total_money = money.getTotal_money(); + int required_money = Objects.requireNonNull(BankStore.getGui_hashmap().get(p.getUniqueId())); + if (total_money >= required_money) { + final Economy econ = MetaversePlugin.getEcon(); + Bank.addMoneyForPlayer(p, total_money - required_money); + econ.depositPlayer(p, required_money); + ChatUtil.success(p, econ.format(required_money) + "を正常に入金しました。"); + gui_hashmap.remove(p.getUniqueId()); + BankStore.setGui_hashmap(gui_hashmap); + inv.clear(); + inv.close(); + } + }, 1L); + } + case 8 -> { + e.setCancelled(true); + final Inventory player_inv = e.getWhoClicked().getInventory(); + final VillagerListener.ReturnMoney returnMoney = VillagerListener.getTotalmoney(player_inv); + for (ItemStack i : returnMoney.getMoney_list()) { + if (Bank.isMoney(i)) { + player_inv.remove(i); + } } + Bank.addMoneyForInventory(inv, returnMoney.getTotal_money()); + } + default -> { + if (id < 9) e.setCancelled(true); } - try { + } + if (id != 4) { + Bukkit.getScheduler().runTaskLater(MetaversePlugin.getInstance(), () -> { + VillagerListener.ReturnMoney money = VillagerListener.getTotalmoney(inv); + int total = money.getTotal_money(); int required_money = Objects.requireNonNull(BankStore.getGui_hashmap().get(p.getUniqueId())); - if (total_money >= required_money) { - final Economy econ = MetaversePlugin.getEcon(); - Bank.addMoneyForPlayer(p, total_money - required_money); - econ.depositPlayer(p, required_money); - ChatUtil.success(p,econ.format(required_money) + "を正常に入金しました。"); - gui_hashmap.remove(p.getUniqueId()); - BankStore.setGui_hashmap(gui_hashmap); - inv.clear(); - inv.close(); + final ItemStack priceItem = Objects.requireNonNull(inv.getItem(4)); + final ItemMeta itemMeta = priceItem.getItemMeta(); + if (required_money > total) { + itemMeta.lore(Arrays.asList( + Component.text("クリックして入金").color(NamedTextColor.GRAY), + Component.text(MetaversePlugin.getEcon().format(required_money - total) + "不足しています").color(NamedTextColor.RED) + )); + } else { + itemMeta.lore(List.of(Component.text("クリックして入金").color(NamedTextColor.GREEN))); } - } catch (NullPointerException ignored){ - } - }, 1L); + priceItem.setItemMeta(itemMeta); + }, 1); + } } } /** * GUIを閉じたときに発火する関数 + * * @param e イベント */ @EventHandler public void onInventoryClose(InventoryCloseEvent e) { Player p = (Player) e.getPlayer(); if (BankStore.getGui_hashmap().containsKey(p.getUniqueId())) { - ChatUtil.warning(p,"お金の入金を取りやめました。"); + ChatUtil.warning(p, "お金の入金を取りやめました。"); HashMap gui_hashmap = BankStore.getGui_hashmap(); Inventory oldInv = e.getInventory(); List items = new ArrayList<>(); - for (int i = 0, size = oldInv.getSize(); i < size; i++) { + for (int i = 9, size = oldInv.getSize(); i < size; i++) { ItemStack item = oldInv.getItem(i); if (item == null) { continue; @@ -104,44 +138,47 @@ public void onInventoryClose(InventoryCloseEvent e) { /** * プレイヤーがログインしてきたとき発火する関数 + * * @param e イベント */ @EventHandler - public void onPlayerJoin(PlayerJoinEvent e){ + public void onPlayerJoin(PlayerJoinEvent e) { Economy econ = MetaversePlugin.getEcon(); - if (BankStore.getRemittance_map().containsKey(e.getPlayer().getUniqueId())){ + if (BankStore.getRemittance_map().containsKey(e.getPlayer().getUniqueId())) { List remittance = BankStore.getRemittance_map().get(e.getPlayer().getUniqueId()); - for(BankNotice i : remittance){ - ChatUtil.success(e.getPlayer(),i.getPlayerUID() + "があなたへ" + i.getFormatedMoney() + "送金しました。\n所持金は" + econ.format(econ.getBalance(e.getPlayer())) + "です。"); + for (BankNotice i : remittance) { + ChatUtil.success(e.getPlayer(), i.getPlayerUID() + "があなたへ" + i.getFormatedMoney() + "送金しました。\n所持金は" + econ.format(econ.getBalance(e.getPlayer())) + "です。"); } } - HashMap login_money_map = BankStore.getLogin_money_map(); - login_money_map.put(e.getPlayer().getUniqueId(),System.currentTimeMillis() / 1000); + HashMap login_money_map = BankStore.getLogin_money_map(); + login_money_map.put(e.getPlayer().getUniqueId(), System.currentTimeMillis() / 1000); BankStore.setLogin_money_map(login_money_map); } /** * プレイヤーが退出したときに発火する関数 + * * @param e イベント */ @EventHandler - public void onPlayerQuit(PlayerQuitEvent e){ - HashMap login_money_map = BankStore.getLogin_money_map(); + public void onPlayerQuit(PlayerQuitEvent e) { + HashMap login_money_map = BankStore.getLogin_money_map(); login_money_map.remove(e.getPlayer().getUniqueId()); BankStore.setLogin_money_map(login_money_map); } /** * プレイヤーがクラフトしたときに発火する関数。通貨でエメラルドブロックを作成できなくする + * * @param e イベント */ @EventHandler - public void onPrepareItemCraft(PrepareItemCraftEvent e){ + public void onPrepareItemCraft(PrepareItemCraftEvent e) { CraftingInventory inv = e.getInventory(); - if(Objects.equals(inv.getResult(), new ItemStack(Material.EMERALD_BLOCK))){ - for (ItemStack item :inv){ - if(Bank.isMoney(item)) + if (Objects.equals(inv.getResult(), new ItemStack(Material.EMERALD_BLOCK))) { + for (ItemStack item : inv) { + if (Bank.isMoney(item)) inv.setResult(new ItemStack(Material.AIR)); } } diff --git a/src/main/java/world/arainu/core/metaverseplugin/listener/VillagerListener.java b/src/main/java/world/arainu/core/metaverseplugin/listener/VillagerListener.java index dbc0496..6ad1c6b 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/listener/VillagerListener.java +++ b/src/main/java/world/arainu/core/metaverseplugin/listener/VillagerListener.java @@ -1,5 +1,7 @@ package world.arainu.core.metaverseplugin.listener; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.milkbowl.vault.economy.Economy; @@ -38,6 +40,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -57,11 +60,15 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { if (Boolean.TRUE.equals(sqlUtil.hasuuid(e.getRightClicked().getUniqueId()))) { e.setCancelled(true); Villager villager = (Villager) e.getRightClicked(); - List tradeitems = villager.getRecipes().stream() + AtomicInteger i = new AtomicInteger(-1); + List tradeitems = villager.getRecipes().stream().map((recipe) -> { + i.getAndIncrement(); + return new Mapdata(recipe,i.get(),villager); + }) .map((recipe) -> new MenuItem( this::onClick, true, - Bank.isMoney(recipe.getResult()) ? recipe.getIngredients().get(0) : recipe.getResult(), + Bank.isMoney(recipe.recipe.getResult()) ? recipe.recipe.getIngredients().get(0) : recipe.recipe.getResult(), recipe, false, -1, @@ -73,6 +80,13 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { } } + @RequiredArgsConstructor + static class Mapdata { + private final MerchantRecipe recipe; + private final int index; + private final Villager villager; + } + /* TODO: Util化 */ @@ -128,6 +142,7 @@ public void onInventoryClick(InventoryClickEvent e) { } case 6 -> { playClickSound((Player) p); + boolean okay = false; if (guiData.isPurchase) { final HashMap item_list = inv.all(item.getType()); int total = 0; @@ -141,6 +156,7 @@ public void onInventoryClick(InventoryClickEvent e) { Bank.addMoneyForPlayer((Player) p, guiData.price * item.getAmount()); total = 0; + okay = true; for (Map.Entry i : item_list.entrySet()) { final ItemStack pay_item = i.getValue(); final int index = i.getKey(); @@ -159,16 +175,22 @@ public void onInventoryClick(InventoryClickEvent e) { } else { final ReturnMoney returnMoney = getTotalmoney(inv); final int required_money = guiData.price * Objects.requireNonNull(inv.getItem(2)).getAmount(); - if (required_money <= returnMoney.total_money) { - for (ItemStack i : returnMoney.money_list) { + if (required_money <= returnMoney.getTotal_money()) { + okay = true; + for (ItemStack i : returnMoney.getMoney_list()) { if (Bank.isMoney(i)) { inv.remove(i); } } - Bank.addMoneyForPlayer((Player) p, returnMoney.total_money - required_money); + Bank.addMoneyForPlayer((Player) p, returnMoney.getTotal_money() - required_money); p.getInventory().addItem(Objects.requireNonNull(inv.getItem(2))); } } + if(okay){ + MerchantRecipe recipe = guiData.villager.getRecipe(guiData.index); + recipe.setUses(recipe.getUses()+1); + guiData.villager.setRecipe(guiData.index,recipe); + } } } } @@ -184,13 +206,8 @@ public void onInventoryClick(InventoryClickEvent e) { } required = item.getAmount(); } else { - final List money_list = new ArrayList<>(inv.all(Material.EMERALD).values()); - for (ItemStack i : money_list) { - if (Bank.isMoney(i)) { - final PersistentDataContainer persistentDataContainer = i.getItemMeta().getPersistentDataContainer(); - total += persistentDataContainer.get(BankStore.getKey(), PersistentDataType.INTEGER) * i.getAmount(); - } - } + ReturnMoney money = getTotalmoney(inv); + total = money.getTotal_money(); required = guiData.price * Objects.requireNonNull(inv.getItem(2)).getAmount(); } @@ -239,7 +256,7 @@ public void onInventoryClick(InventoryClickEvent e) { * @param inv 対象のインベントリ * @return お金の情報 */ - public ReturnMoney getTotalmoney(Inventory inv) { + public static ReturnMoney getTotalmoney(Inventory inv) { final List money_list = new ArrayList<>(inv.all(Material.EMERALD).values()); int total_money = 0; for (ItemStack i : money_list) { @@ -266,8 +283,8 @@ static class ReturnMoney { this.total_money = total_money; } - private final List money_list; - private final int total_money; + @Getter private final List money_list; + @Getter private final int total_money; } /** @@ -288,7 +305,9 @@ public void onInventoryClose(InventoryCloseEvent e) { } private void onClick(MenuItem e) { - MerchantRecipe recipe = (MerchantRecipe) e.getCustomData(); + MerchantRecipe recipe = ((Mapdata) e.getCustomData()).recipe; + int index = ((Mapdata) e.getCustomData()).index; + Villager villager = ((Mapdata) e.getCustomData()).villager; boolean isPurchase = Bank.isMoney(recipe.getResult()); ItemStack money = Bank.isMoney(recipe.getResult()) ? recipe.getResult() : recipe.getIngredients().get(0); int price = money.getAmount() * money.getItemMeta().getPersistentDataContainer().get(BankStore.getKey(), PersistentDataType.INTEGER); @@ -350,19 +369,17 @@ private void onClick(MenuItem e) { inv.setItem(i, partition); } - invMap.put(inv, new GuiData(price, isPurchase)); + invMap.put(inv, new GuiData(price, index, isPurchase,villager)); e.getClicker().openInventory(inv); } private final HashMap invMap = new HashMap<>(); + @RequiredArgsConstructor private static class GuiData { - GuiData(int price, boolean isPurchase) { - this.price = price; - this.isPurchase = isPurchase; - } - private final int price; + private final int index; private final boolean isPurchase; + private final Villager villager; } } diff --git a/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java b/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java index 6b077ee..ea27461 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java +++ b/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java @@ -313,6 +313,6 @@ public static List getWhitelist() { private final static int port = MetaversePlugin.getConfiguration().getInt("mysql.port"); @Getter private final static String url = MetaversePlugin.getConfiguration().getString("mysql.url"); - private final static String url_connection = "jdbc:mysql://" + url + ":" + port + "/" + db_name + "?autoReconnect=true&maxReconnects=3"; + private final static String url_connection = "jdbc:mysql://" + url + ":" + port + "/" + db_name + "?autoReconnect=true&maxReconnects=3&useSSL=false"; private static Connection conn; }