diff --git a/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java b/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java index a53d55d..5ded90a 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java +++ b/src/main/java/world/arainu/core/metaverseplugin/MetaversePlugin.java @@ -31,16 +31,7 @@ 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.Bank; -import world.arainu.core.metaverseplugin.iphone.ChestLock; -import world.arainu.core.metaverseplugin.iphone.Drilling; -import world.arainu.core.metaverseplugin.iphone.LinkDiscord; -import world.arainu.core.metaverseplugin.iphone.MoveSurvival; -import world.arainu.core.metaverseplugin.iphone.Municipal; -import world.arainu.core.metaverseplugin.iphone.Spawn; -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.iphone.*; import world.arainu.core.metaverseplugin.listener.AdvancementListener; import world.arainu.core.metaverseplugin.listener.BankListener; import world.arainu.core.metaverseplugin.listener.ChestLockListener; @@ -189,6 +180,7 @@ private void loadGuis() { chestMeta.lore(Arrays.asList(Component.text("チェストに向かって使用することで"), Component.text("チェストを個人用チェストにすることができます。"), Component.text("300円/個").color(NamedTextColor.GOLD))); chestItem.setItemMeta(chestMeta); iPhoneStore.addGuiItem(new MenuItem("チェストの鍵を購入する", new ChestLock()::executeGui, true, chestItem), (p) -> Objects.equals(ServerStore.getServerName(), "survival")); + iPhoneStore.addGuiItem(new MenuItem("Metazon", new Metazon()::executeGui, true, Material.CHEST), (p) -> Objects.equals(ServerStore.getServerName(), "survival")); } /** diff --git a/src/main/java/world/arainu/core/metaverseplugin/commands/CommandSpawn.java b/src/main/java/world/arainu/core/metaverseplugin/commands/CommandSpawn.java index 895ca3e..8a9a6f3 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/commands/CommandSpawn.java +++ b/src/main/java/world/arainu/core/metaverseplugin/commands/CommandSpawn.java @@ -9,13 +9,14 @@ import org.bukkit.entity.Villager; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MerchantRecipe; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; import world.arainu.core.metaverseplugin.iphone.Bank; import world.arainu.core.metaverseplugin.utils.ChatUtil; import world.arainu.core.metaverseplugin.utils.sqlUtil; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * プラグイン特有のmobをスポーンさせるコマンドを定義している関数 @@ -24,13 +25,13 @@ */ public class CommandSpawn extends CommandPlayerOnlyBase { @Getter - private final CommandSpawn Instance; + private static final Map METAZON_VILLAGER = Map.of("mason-villager", "鉱石店員","stone-villager", "石工店員","mason-villager-shop","お金店員(鉱石)", "stone-villager-shop","お金店員(石系)", "mob-villager-shop","モブ店員", "sandstone-villager","砂岩砂利店員", "sandstone-villager-shop","お金店員(砂岩系&砂利)"); - /** - * プラグイン特有のmobをスポーンさせるコマンドを定義している関数 - */ - public CommandSpawn() { - this.Instance = this; + @Getter + private static CommandSpawn instance; + + public CommandSpawn(){ + instance = this; } /** @@ -71,7 +72,7 @@ public static MerchantRecipe createRecipe2(int yen, int quantity, ItemStack ingr * @param player プレイヤー(ここの座標に作成する) * @return 村人 */ - public static Villager createVillager(String name, Villager.Profession type, Player player) { + public static Villager createVillager(String name, Villager.Profession type, Player player,String[] args) { Villager villager = (Villager) player.getWorld().spawnEntity(player.getLocation(), EntityType.VILLAGER); villager.setProfession(type); villager.setVillagerLevel(5); @@ -79,20 +80,22 @@ public static Villager createVillager(String name, Villager.Profession type, Pla villager.setCustomNameVisible(true); villager.setAI(false); villager.setInvulnerable(true); + if(args.length == 2) { + if (Objects.equals(args[1], "invisible")) { + villager.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 9999, 255, false, false)); + } + } + sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); return villager; } @Override public boolean execute(Player player, String[] args) { - if (args.length == 1) { + if (args.length == 1 || args.length == 2) { switch (args[0]) { - case "casino-villager" -> { - Villager villager = createVillager("スロットマン", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); - } + case "casino-villager" -> createVillager("スロットマン", Villager.Profession.MASON, player,args); case "mason-villager" -> { - Villager villager = createVillager("鉱石店員", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe(1, 50, new ItemStack(Material.COAL))); recipes.add(createRecipe(5, 40, new ItemStack(Material.RAW_COPPER))); @@ -104,8 +107,7 @@ public boolean execute(Player player, String[] args) { villager.setRecipes(recipes); } case "mason-villager-shop" -> { - Villager villager = createVillager("お金店員(鉱石)", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe2(1, 50, new ItemStack(Material.COAL))); recipes.add(createRecipe2(5, 40, new ItemStack(Material.RAW_COPPER))); @@ -117,8 +119,7 @@ public boolean execute(Player player, String[] args) { villager.setRecipes(recipes); } case "stone-villager" -> { - Villager villager = createVillager("石工店員", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe(1, 3, new ItemStack(Material.COBBLESTONE))); recipes.add(createRecipe(1, 5, new ItemStack(Material.MOSSY_COBBLESTONE))); @@ -170,8 +171,7 @@ public boolean execute(Player player, String[] args) { villager.setRecipes(recipes); } case "stone-villager-shop" -> { - Villager villager = createVillager("お金店員(石系)", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe2(1, 3, new ItemStack(Material.COBBLESTONE))); recipes.add(createRecipe2(1, 5, new ItemStack(Material.MOSSY_COBBLESTONE))); @@ -222,9 +222,8 @@ public boolean execute(Player player, String[] args) { recipes.add(createRecipe2(1, 5, new ItemStack(Material.POINTED_DRIPSTONE))); villager.setRecipes(recipes); } - case "mob-villager" -> { - Villager villager = createVillager("モブ店員", Villager.Profession.FARMER, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0] + "-shop"); + case "mob-villager-shop" -> { + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.FARMER, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe2(1000, 5, new ItemStack(Material.AXOLOTL_SPAWN_EGG))); recipes.add(createRecipe2(500, 5, new ItemStack(Material.BEE_SPAWN_EGG))); @@ -257,8 +256,7 @@ public boolean execute(Player player, String[] args) { } case "sandstone-villager" -> { - Villager villager = createVillager("砂岩砂利店員", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe(1, 5, new ItemStack(Material.GRAVEL))); recipes.add(createRecipe(1, 5, new ItemStack(Material.SANDSTONE))); @@ -272,8 +270,7 @@ public boolean execute(Player player, String[] args) { villager.setRecipes(recipes); } case "sandstone-villager-shop" -> { - Villager villager = createVillager("お金店員(砂岩系&砂利)", Villager.Profession.MASON, player); - sqlUtil.setuuidtype(villager.getUniqueId(), args[0]); + Villager villager = createVillager(METAZON_VILLAGER.get(args[0]), Villager.Profession.MASON, player,args); List recipes = new ArrayList<>(); recipes.add(createRecipe2(1, 5, new ItemStack(Material.GRAVEL))); recipes.add(createRecipe2(1, 5, new ItemStack(Material.SANDSTONE))); @@ -299,6 +296,8 @@ public boolean execute(Player player, String[] args) { @Override public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String label, String[] args) { - return List.of("casino-villager", "mason-villager", "stone-villager", "mason-villager-shop", "stone-villager-shop", "mob-villager", "sandstone-villager", "sandstone-villager-shop"); + List r = new ArrayList<>(METAZON_VILLAGER.keySet()); + r.add("casino-villager"); + return r; } } diff --git a/src/main/java/world/arainu/core/metaverseplugin/iphone/Metazon.java b/src/main/java/world/arainu/core/metaverseplugin/iphone/Metazon.java new file mode 100644 index 0000000..8a7580a --- /dev/null +++ b/src/main/java/world/arainu/core/metaverseplugin/iphone/Metazon.java @@ -0,0 +1,32 @@ +package world.arainu.core.metaverseplugin.iphone; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import world.arainu.core.metaverseplugin.MetaversePlugin; +import world.arainu.core.metaverseplugin.commands.CommandSpawn; +import world.arainu.core.metaverseplugin.gui.Gui; +import world.arainu.core.metaverseplugin.gui.MenuItem; +import world.arainu.core.metaverseplugin.listener.VillagerListener; +import world.arainu.core.metaverseplugin.utils.sqlUtil; + +import java.util.Objects; +import java.util.stream.Collectors; + +public class Metazon extends iPhoneBase { + @Override + public void executeGui(MenuItem menuItem) { + Gui.getInstance().openMenu(menuItem.getClicker(), "Metazon", CommandSpawn.getMETAZON_VILLAGER().entrySet().stream().map((n) -> new MenuItem(n.getValue(),this::openMetazon, true,Material.STONE,n.getKey())).collect(Collectors.toList())); + } + + private void openMetazon(MenuItem menuItem){ + Player p = menuItem.getClicker(); + // テスト鯖でデバッグ時に例外が発生しないようにするコード + if(Objects.requireNonNull(sqlUtil.getuuidsbytype((String) menuItem.getCustomData())).size() == 0){ + MetaversePlugin.logger().warning("Villager entityが存在しないため、新規作成します(自動破棄されます)"); + CommandSpawn.getInstance().execute(p, new String[]{(String) menuItem.getCustomData(),"invisible"}); + } + VillagerListener.getInstance().open(p, (Villager) Objects.requireNonNull(Bukkit.getEntity(Objects.requireNonNull(sqlUtil.getuuidsbytype((String) menuItem.getCustomData())).get(0))), (int) p.getWorld().getSpawnLocation().distance(p.getLocation())); + } +} 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 1c93428..505d6bd 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,6 @@ package world.arainu.core.metaverseplugin.listener; +import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.milkbowl.vault.economy.Economy; @@ -21,6 +22,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.bukkit.potion.PotionEffectType; import world.arainu.core.metaverseplugin.MetaversePlugin; import world.arainu.core.metaverseplugin.gui.Gui; import world.arainu.core.metaverseplugin.gui.MenuItem; @@ -49,6 +51,11 @@ */ public class VillagerListener implements Listener { private final HashMap invMap = new HashMap<>(); + @Getter private static VillagerListener instance; + + public VillagerListener(){ + instance = this; + } /** * インベントリ内のお金を取得する関数 @@ -68,6 +75,25 @@ public static ReturnMoney getTotalmoney(Inventory inv) { return new ReturnMoney(money_list, total_money); } + public void open(Player player, Villager villager,int fee){ + AtomicInteger i = new AtomicInteger(-1); + List tradeitems = villager.getRecipes().stream().map((recipe) -> { + i.getAndIncrement(); + return new Mapdata(recipe, i.get(), villager, fee); + }) + .map((recipe) -> new MenuItem( + this::onClick, + true, + Bank.isMoney(recipe.recipe.getResult()) ? recipe.recipe.getIngredients().get(0) : recipe.recipe.getResult(), + recipe, + false, + -1, + -1)) + .collect(Collectors.toList()); + + Gui.getInstance().openMenu(player, villager.getName(), tradeitems); + } + /** * プレイヤーが右クリックしたときに特定の村人の場合は独自UIを表示させるリスナー * @@ -83,22 +109,7 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { obj.start(e.getPlayer()); } else { Villager villager = (Villager) e.getRightClicked(); - 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.recipe.getResult()) ? recipe.recipe.getIngredients().get(0) : recipe.recipe.getResult(), - recipe, - false, - -1, - -1)) - .collect(Collectors.toList()); - - Gui.getInstance().openMenu(e.getPlayer(), villager.getName(), tradeitems); + open(e.getPlayer(),villager, 0); } } } @@ -250,8 +261,7 @@ public void onInventoryClick(InventoryClickEvent e) { if (inv.getType() == InventoryType.MERCHANT) { HashMap items = inv.all(Material.EMERALD); List isMoney = items.values().stream() - .map(itemStack -> itemStack.getItemMeta().getPersistentDataContainer().has(BankStore.getKey(), PersistentDataType.INTEGER)) - .collect(Collectors.toList()); + .map(itemStack -> itemStack.getItemMeta().getPersistentDataContainer().has(BankStore.getKey(), PersistentDataType.INTEGER)).toList(); MerchantRecipe recipe = ((MerchantInventory) inv).getSelectedRecipe(); if (recipe != null && isMoney.contains(true)) { recipe.setUses(recipe.getUses() - 1); @@ -276,6 +286,10 @@ public void onInventoryClose(InventoryCloseEvent e) { if (item == null) continue; ItemUtil.addItem(item, e.getPlayer().getInventory(), (Player) e.getPlayer()); } + if(invMap.get(inv).villager().getPotionEffect(PotionEffectType.INVISIBILITY) != null){ + sqlUtil.removeuuidtype(invMap.get(inv).villager().getUniqueId()); + invMap.get(inv).villager().remove(); + } invMap.remove(inv); } @@ -284,8 +298,8 @@ private void onClick(MenuItem e) { 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() * Objects.requireNonNull(money.getItemMeta().getPersistentDataContainer().get(BankStore.getKey(), PersistentDataType.INTEGER)); + ItemStack money = isPurchase ? recipe.getResult() : recipe.getIngredients().get(0); + int price = money.getAmount() * Objects.requireNonNull(money.getItemMeta().getPersistentDataContainer().get(BankStore.getKey(), PersistentDataType.INTEGER)) + ((Mapdata) e.getCustomData()).fee() * (isPurchase ? -1 : 1); final Inventory inv; if (isPurchase) { inv = Bukkit.createInventory(null, 27, e.getIcon().displayName().append(Component.text(" を買取")).color(NamedTextColor.BLACK)); @@ -356,7 +370,7 @@ private void onClick(MenuItem e) { /** * Mapのreturnに使うやつ */ - record Mapdata(MerchantRecipe recipe, int index, Villager villager) { + record Mapdata(MerchantRecipe recipe, int index, Villager villager,int fee) { } /** diff --git a/src/main/java/world/arainu/core/metaverseplugin/scheduler/AdvancementScheduler.java b/src/main/java/world/arainu/core/metaverseplugin/scheduler/AdvancementScheduler.java index 6087033..fa14b01 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/scheduler/AdvancementScheduler.java +++ b/src/main/java/world/arainu/core/metaverseplugin/scheduler/AdvancementScheduler.java @@ -25,10 +25,10 @@ public void run() { AtomicInteger i = new AtomicInteger(); AtomicInteger j = new AtomicInteger(); Bukkit.advancementIterator().forEachRemaining(advancement -> { - Bukkit.getScheduler().runTaskLater(MetaversePlugin.getInstance(),() -> addPlayerAdvancement(advancement, p),j.get()); + Bukkit.getScheduler().runTaskLaterAsynchronously(MetaversePlugin.getInstance(),() -> addPlayerAdvancement(advancement, p),j.get()); i.getAndIncrement(); - if(i.get()%50 == 0){ - j.set(j.get()+2); + if(i.get()%150 == 0){ + j.set(j.get()+5); } }); MetaversePlugin.logger().info("synced"); 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 09f3e2b..8ede45d 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java +++ b/src/main/java/world/arainu/core/metaverseplugin/utils/sqlUtil.java @@ -168,6 +168,23 @@ public static void setuuidtype(UUID uuid, String type) { } } + /** + * 何かしらのタイプとUUIDの紐付けを解除する関数 + * + * @param uuid UUID + */ + public static void removeuuidtype(UUID uuid) { + try { + create_uuidtype_table(); + PreparedStatement ps = conn.prepareStatement("DELETE FROM `uuidtype` WHERE `uuid` LIKE ?"); + ps.setString(1,uuid.toString()); + ps.executeUpdate(); + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + /** * 何かしらのタイプとUUIDを紐付ける関数。 *