diff --git a/build.gradle b/build.gradle index 5a2c1be0d..82d75b12e 100644 --- a/build.gradle +++ b/build.gradle @@ -88,7 +88,7 @@ java { } paperweight { - addServerDependencyTo = configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).map { [it] as Set } + addServerDependencyTo = configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).map { [it] as Set } } tasks.withType(JavaCompile).configureEach { @@ -134,4 +134,4 @@ tasks.shadowJar { tasks.test { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java index 64ed42da0..1ff6f7e08 100644 --- a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java +++ b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java @@ -168,12 +168,10 @@ void onPlayerDeath(PlayerDeathEvent event) { * Méthode qui permet de verifier si l'item est celui avec qui on interagit */ private static boolean isItemInteraction(ItemStack item) { - if (item == null || item.getType() == Material.AIR) - return false; + if (item == null || item.getType() == Material.AIR) return false; ItemMeta meta = item.getItemMeta(); - if (meta == null) - return false; + if (meta == null) return false; if (item.hasItemMeta()) { PersistentDataContainer data = item.getItemMeta().getPersistentDataContainer(); diff --git a/src/main/java/fr/openmc/core/CommandsManager.java b/src/main/java/fr/openmc/core/CommandsManager.java index dad54dcc6..92d83c900 100644 --- a/src/main/java/fr/openmc/core/CommandsManager.java +++ b/src/main/java/fr/openmc/core/CommandsManager.java @@ -8,6 +8,8 @@ import fr.openmc.core.commands.fun.Playtime; import fr.openmc.core.commands.utils.*; import fr.openmc.core.features.adminshop.AdminShopCommand; +import fr.openmc.core.features.corporation.commands.ShopAdminCommand; +import fr.openmc.core.features.corporation.commands.ShopCommand; import fr.openmc.core.features.credits.CreditsCommand; import fr.openmc.core.features.cube.CubeCommands; import fr.openmc.core.features.events.halloween.commands.HalloweenCommands; @@ -59,6 +61,8 @@ private static void registerCommands() { new Cooldowns(), new CreditsCommand(), new CubeCommands(), + new ShopCommand(), + new ShopAdminCommand(), new HalloweenCommands() ); } diff --git a/src/main/java/fr/openmc/core/ListenersManager.java b/src/main/java/fr/openmc/core/ListenersManager.java index e5977fe91..1c184e0ef 100644 --- a/src/main/java/fr/openmc/core/ListenersManager.java +++ b/src/main/java/fr/openmc/core/ListenersManager.java @@ -2,6 +2,7 @@ import fr.openmc.api.input.ChatInput; import fr.openmc.api.input.location.ItemInteraction; +import fr.openmc.core.features.corporation.listener.ShopListener; import fr.openmc.core.features.cube.listeners.CubeListener; import fr.openmc.core.features.cube.listeners.RepulseEffectListener; import fr.openmc.core.features.cube.multiblocks.MultiBlocksListeners; @@ -38,6 +39,7 @@ public static void init() { new PlayerSettingsManager(), new InteractListener(), new AywenCapListener(), + new ShopListener(), new NoMoreRabbit(), new ArmorListener(), new SpawnerExtractorListener() diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 7974063fc..03cf5f3e0 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -16,6 +16,7 @@ import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.corporation.manager.ShopManager; import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import fr.openmc.core.features.displays.TabList; import fr.openmc.core.features.displays.bossbar.BossbarManager; @@ -153,6 +154,7 @@ public void loadWithItemsAdder() { QuestsManager.init(); CityManager.init(); ContestManager.init(); + ShopManager.init(); DreamManager.init(); MultiBlockManager.init(); if (WorldGuardHook.isHasWorldGuard()) { @@ -216,6 +218,9 @@ public void onDisable() { // - Cooldowns DynamicCooldownManager.saveCooldowns(); + + // - Shops + ShopManager.shutdown(); if (!OMCPlugin.isUnitTestVersion()) { diff --git a/src/main/java/fr/openmc/core/disabled/corporation/manager/CompanyManager.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/CompanyManager.java.bak similarity index 98% rename from src/main/java/fr/openmc/core/disabled/corporation/manager/CompanyManager.java.bak rename to src/main/java/fr/openmc/core/disabled/corporation/CompanyManager.java.bak index fdf099154..da80587b7 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/manager/CompanyManager.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/CompanyManager.java.bak @@ -1,4 +1,4 @@ -package fr.openmc.core.disabled.corporation.manager; +package fr.openmc.core.disabled.corporation; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; @@ -10,14 +10,18 @@ import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; import fr.openmc.core.disabled.corporation.CorpPermission; import fr.openmc.core.disabled.corporation.MethodState; +import fr.openmc.core.features.city.City; +import fr.openmc.core.features.city.CityManager; +import fr.openmc.core.features.corporation.MethodState; import fr.openmc.core.disabled.corporation.commands.CompanyCommand; -import fr.openmc.core.disabled.corporation.commands.ShopCommand; +import fr.openmc.core.features.corporation.commands.ShopCommand; import fr.openmc.core.disabled.corporation.company.Company; import fr.openmc.core.disabled.corporation.company.CompanyOwner; -import fr.openmc.core.disabled.corporation.data.MerchantData; -import fr.openmc.core.disabled.corporation.listener.CustomItemsCompanyListener; -import fr.openmc.core.disabled.corporation.listener.ShopListener; +import fr.openmc.core.features.corporation.data.MerchantData; +import fr.openmc.core.features.corporation.listener.ShopListener; import fr.openmc.core.disabled.corporation.models.*; +import fr.openmc.core.features.corporation.manager.PlayerShopManager; +import fr.openmc.core.features.corporation.manager.ShopManager; import fr.openmc.core.disabled.corporation.shops.Shop; import fr.openmc.core.disabled.corporation.shops.ShopItem; import fr.openmc.core.disabled.corporation.shops.Supply; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/ItemsAdderIntegration.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/ItemsAdderIntegration.java.bak deleted file mode 100644 index 543bfbc51..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/ItemsAdderIntegration.java.bak +++ /dev/null @@ -1,32 +0,0 @@ -package fr.openmc.core.disabled.corporation; - -import dev.lone.itemsadder.api.CustomFurniture; -import dev.lone.itemsadder.api.CustomStack; -import org.bukkit.block.Block; - -public class ItemsAdderIntegration { - - public static boolean placeShopFurniture(Block block) { - CustomStack customFurniture = CustomFurniture.getInstance("omc_company:caisse"); - if (customFurniture == null || block.getType() != org.bukkit.Material.AIR) - return false; - - CustomFurniture.spawn("omc_company:caisse", block); - return true; - } - - public static boolean removeShopFurniture(Block block) { - CustomStack placed = CustomFurniture.byAlreadySpawned(block); - if (placed == null || !placed.getNamespacedID().equals("omc_company:caisse")) - return false; - - CustomFurniture.remove(CustomFurniture.byAlreadySpawned(block).getEntity(), false); - return true; - } - - public static boolean hasFurniture(Block block) { - CustomStack placed = CustomFurniture.byAlreadySpawned(block); - return placed != null && placed.getNamespacedID().equals("omc_company:caisse"); - } - -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/commands/CompanyCommand.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/commands/CompanyCommand.java.bak index 3af19adf6..d4fabc5d9 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/commands/CompanyCommand.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/commands/CompanyCommand.java.bak @@ -3,11 +3,11 @@ package fr.openmc.core.disabled.corporation.commands; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.disabled.corporation.CorpPermission; -import fr.openmc.core.disabled.corporation.MethodState; +import fr.openmc.core.features.corporation.MethodState; import fr.openmc.core.disabled.corporation.company.Company; import fr.openmc.core.disabled.corporation.company.CompanyOwner; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.PlayerShopManager; +import fr.openmc.core.disabled.corporation.CompanyManager; +import fr.openmc.core.features.corporation.manager.PlayerShopManager; import fr.openmc.core.disabled.corporation.menu.company.CompanyBaltopMenu; import fr.openmc.core.disabled.corporation.menu.company.CompanyMenu; import fr.openmc.core.disabled.corporation.menu.company.CompanySearchMenu; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/commands/ShopCommand.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/commands/ShopCommand.java.bak deleted file mode 100644 index ed1d099e4..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/commands/ShopCommand.java.bak +++ /dev/null @@ -1,367 +0,0 @@ -package fr.openmc.core.disabled.corporation.commands; - - -import fr.openmc.core.disabled.corporation.CorpPermission; -import fr.openmc.core.disabled.corporation.MethodState; -import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.PlayerShopManager; -import fr.openmc.core.disabled.corporation.menu.company.ShopManageMenu; -import fr.openmc.core.disabled.corporation.menu.shop.ShopMenu; -import fr.openmc.core.disabled.corporation.menu.shop.ShopSearchMenu; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import fr.openmc.core.disabled.corporation.shops.Supply; -import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.utils.ItemUtils; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.text.Component; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import revxrsal.commands.annotation.*; -import revxrsal.commands.bukkit.annotation.CommandPermission; - -import java.util.Iterator; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; - -@Command({"shop", "shops"}) -@Description("Manage shops") -@CommandPermission("omc.commands.shop") -public class ShopCommand { - - @DefaultFor("~") - public void onCommand(Player player) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - if (isInCompany) { - ShopManageMenu shopManageMenu = new ShopManageMenu(player, CompanyManager.getCompany(player.getUniqueId())); - shopManageMenu.open(); - } - } - - @Subcommand("help") - @Description("Explique comment marche un shop") - @Cooldown(30) - public void help(Player player) { - MessagesManager.sendMessage(player, Component.text(""" - §6§lListe des commandes entreprise : - - §e▪ /shop create§7 - Crée un shop si vous regarder un tonneau - §e▪ /shop sell §7 - Permet de mettre en vente l'item dans votre main - §e▪ /shop unsell§7 - Permet de retirer de la vente l'item que vous tenez en main - §e▪ /shop delete§7 - Permet de supprimer votre shop en le regardant - §e▪ /shop manage§7 - Permet de gérer sont shop a distance seulement si vous n'êtes pas dans une entreprise - §e▪ /shop search§7 - Permet de rechercher des shops par leur nom ou le nom du joueur - """), - Prefix.ENTREPRISE, MessageType.INFO, false); - } - - @Subcommand("create") - @Description("Create a shop") - public void createShop(Player player) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - Block targetBlock = player.getTargetBlockExact(5); - if (targetBlock == null || targetBlock.getType() != Material.BARREL) { - MessagesManager.sendMessage(player, Component.text("§cVous devez regarder un tonneau pour créer un shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - Block aboveBlock = Objects.requireNonNull(targetBlock.getLocation().getWorld()).getBlockAt(targetBlock.getLocation().clone().add(0, 1, 0)); - if (aboveBlock.getType() != Material.AIR) { - MessagesManager.sendMessage(player, Component.text("§cVous devez liberer de l'espace au dessus de votre tonneau pour créer un shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (isInCompany) { - Company company = CompanyManager.getCompany(player.getUniqueId()); - if (!company.hasPermission(player.getUniqueId(), CorpPermission.CREATESHOP)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas la permission pour créer un shop dans l'entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (!company.createShop(player.getUniqueId(), targetBlock, aboveBlock)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez d'argent dans la banque de votre entreprise pour créer un shop (100" + EconomyManager.getEconomyIcon() + ")"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MessagesManager.sendMessage(player, Component.text("§6[Shop] §c -100" + EconomyManager.getEconomyIcon() + " sur la banque de l'entreprise"), Prefix.SHOP, MessageType.SUCCESS, false); - MessagesManager.sendMessage(player, Component.text("§aUn shop a bien été crée pour votre entreprise !"), Prefix.SHOP, MessageType.SUCCESS, false); - return; - } - if (PlayerShopManager.hasShop(player.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("§cVous avez déjà un shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (!PlayerShopManager.createShop(player.getUniqueId(), targetBlock, aboveBlock, null)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez d'argent pour créer un shop (500" + EconomyManager.getEconomyIcon() + ")"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MessagesManager.sendMessage(player, Component.text("§6[Shop] §c -500" + EconomyManager.getEconomyIcon() +" sur votre compte personnel"), Prefix.SHOP, MessageType.SUCCESS, false); - MessagesManager.sendMessage(player, Component.text("§aVous avez bien crée un shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - } - - @Subcommand("sell") - @Description("Sell an item in your shop") - public void sellItem(Player player, @Named("price") double price) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - - if (price<=0){ - MessagesManager.sendMessage(player, Component.text("§cVeuillez mettre un prix supérieur à zéro !"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - if (isInCompany) { - UUID shopUUID = Shop.getShopPlayerLookingAt(player, false); - if (shopUUID == null) { - MessagesManager.sendMessage(player, Component.text("§cShop non reconnu"), Prefix.SHOP, MessageType.INFO, false); - return; - } - Shop shop = CompanyManager.getCompany(player.getUniqueId()).getShop(shopUUID); - if (shop == null) { - MessagesManager.sendMessage(player, Component.text("§cCe shop n'appartient pas à votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - if (!CompanyManager.getCompany(player.getUniqueId()).hasPermission(player.getUniqueId(), CorpPermission.SELLER)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas l'autorisation de vendre un item dans ce shop de l'entrprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - ItemStack item = player.getInventory().getItemInMainHand(); - boolean itemThere = shop.addItem(item, price, 1, null); - - if (itemThere) { - MessagesManager.sendMessage(player, Component.text("§cCet item est déjà dans le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - MessagesManager.sendMessage(player, Component.text("§aL'item a bien été ajouté au shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - return; - } - if (!PlayerShopManager.hasShop(player.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - Shop shop = PlayerShopManager.getPlayerShop(player.getUniqueId()); - ItemStack item = player.getInventory().getItemInMainHand(); - if (item.getType() == Material.AIR) { - MessagesManager.sendMessage(player, Component.text("§cVous devez tenir un item dans votre main"), Prefix.SHOP, MessageType.INFO, false); - return; - } - boolean itemThere = shop.addItem(item, price, 1, null); - if (itemThere) { - MessagesManager.sendMessage(player, Component.text("§cCet item est déjà dans le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MessagesManager.sendMessage(player, Component.text("§aL'item a bien été ajouté au shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - } - - @Subcommand("unsell") - @Description("Unsell an item in your shop") - public void unsellItem(Player player, @Named("item number") int itemIndex) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - if (isInCompany) { - UUID shopUUID = Shop.getShopPlayerLookingAt(player, false); - if (shopUUID == null) { - MessagesManager.sendMessage(player, Component.text("§cShop non reconnu"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - Shop shop = CompanyManager.getCompany(player.getUniqueId()).getShop(shopUUID); - if (shop == null) { - MessagesManager.sendMessage(player, Component.text("§cCe shop n'appartient pas à votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - if (!CompanyManager.getCompany(player.getUniqueId()).hasPermission(player.getUniqueId(), CorpPermission.SELLER)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas l'autorisation de retirer un item en vente dans ce shop de l'entrprise"), Prefix.SHOP, MessageType.INFO, false); - } - - if (itemIndex < 1 || itemIndex >= shop.getItems().size() + 1) { - MessagesManager.sendMessage(player, Component.text("§cCet item n'est pas dans le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - ShopItem item = shop.getItem(itemIndex - 1); - if (item == null) { - MessagesManager.sendMessage(player, Component.text("§cCet item n'est pas dans le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - if (CompanyManager.getCompany(player.getUniqueId()).hasPermission(player.getUniqueId(), CorpPermission.OWNER)){ - recoverStock(player, item, shop); - return; - } - - if (shop.isSupplier(player.getUniqueId()) ){ - int toTake = shop.recoverItemOf(item, player); - - if (toTake == 0) return; - - if (item.getAmount() >= 0) { - ItemStack toGive = item.getItem().clone(); - toGive.setAmount(toTake); - player.getInventory().addItem(toGive); - if (item.getAmount() > 0){ - MessagesManager.sendMessage(player, Component.text("§6Vous avez récupéré §a" + toTake + "§6 dans le stock de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } else { - MessagesManager.sendMessage(player, Component.text("§6Vous avez récupéré le stock restant de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } - return; - } - } - - return; - } - if (!PlayerShopManager.hasShop(player.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - Shop shop = PlayerShopManager.getPlayerShop(player.getUniqueId()); - ShopItem item = shop.getItem(itemIndex - 1); - - if (item == null) { - MessagesManager.sendMessage(player, Component.text("§cCet item n'est pas dans le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - shop.removeItem(item); - MessagesManager.sendMessage(player, Component.text("§aL'item a bien été retiré du shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - - if (item.getAmount() > 0) { - ItemStack toGive = item.getItem().clone(); - toGive.setAmount(item.getAmount()); - player.getInventory().addItem(toGive); - MessagesManager.sendMessage(player, Component.text("§6Vous avez récupéré le stock restant de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } - } - - @Subcommand("delete") - @Description("Delete a shop") - public void deleteShop(Player player) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - UUID shopUUID = Shop.getShopPlayerLookingAt(player, false); - if (shopUUID == null) { - MessagesManager.sendMessage(player, Component.text("§cShop non reconnu"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (isInCompany) { - Shop shop = CompanyManager.getCompany(player.getUniqueId()).getShop(shopUUID); - if (shop == null) { - MessagesManager.sendMessage(player, Component.text("§cCe shop n'appartient pas à votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (!CompanyManager.getCompany(player.getUniqueId()).hasPermission(player.getUniqueId(), CorpPermission.DELETESHOP)) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas la permission pour supprimer un shop de l'entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MethodState deleteState = CompanyManager.getCompany(player.getUniqueId()).deleteShop(player, shop.getUuid()); - if (deleteState == MethodState.ERROR) { - MessagesManager.sendMessage(player, Component.text("§cCe shop n'existe pas dans votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.WARNING) { - MessagesManager.sendMessage(player, Component.text("§cCe shop n'est pas vide"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.SPECIAL) { - MessagesManager.sendMessage(player, Component.text("§cIl vous faut au minimum le nombre d'argent remboursable pour supprimer un shop et obtenir un remboursement dans la banque de votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.ESCAPE) { - MessagesManager.sendMessage(player, Component.text("§cCaisse introuvable (appelez un admin)"), Prefix.SHOP, MessageType.INFO, false); - } - MessagesManager.sendMessage(player, Component.text("§a" + shop.getName() + " supprimé !"), Prefix.SHOP, MessageType.SUCCESS, false); - MessagesManager.sendMessage(player, Component.text("§6[Shop] §a +75" + EconomyManager.getEconomyIcon() + " de remboursés sur la banque de l'entreprise"), Prefix.SHOP, MessageType.SUCCESS, false); - } - if (!PlayerShopManager.hasShop(player.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MethodState methodState = PlayerShopManager.deleteShop(player.getUniqueId()); - if (methodState == MethodState.WARNING) { - MessagesManager.sendMessage(player, Component.text("§cVotre shop n'est pas vide"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (methodState == MethodState.ESCAPE) { - MessagesManager.sendMessage(player, Component.text("§cCaisse introuvable (appelez un admin)"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MessagesManager.sendMessage(player, Component.text("§6Votre shop a bien été supprimé !"), Prefix.SHOP, MessageType.SUCCESS, false); - MessagesManager.sendMessage(player, Component.text("§6[Shop] §a +400" + EconomyManager.getEconomyIcon() + " de remboursés sur votre compte personnel"), Prefix.SHOP, MessageType.SUCCESS, false); - } - - @Subcommand("manage") - @Description("Manage a shop") - public static void manageShop(Player player) { - boolean isInCompany = CompanyManager.isInCompany(player.getUniqueId()); - if (isInCompany) { - ShopManageMenu shopManageMenu = new ShopManageMenu(player, CompanyManager.getCompany(player.getUniqueId())); - shopManageMenu.open(); - return; - } - if (!PlayerShopManager.hasShop(player.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - ShopMenu shopMenu = new ShopMenu(player, PlayerShopManager.getPlayerShop(player.getUniqueId()), 0); - shopMenu.open(); - } - - @Subcommand("search") - @Description("Recherche un shop") - public void searchShop(Player player){ - new ShopSearchMenu(player).open(); - } - - private void recoverStock(Player owner, ShopItem stock, Shop shop){ - if (stock.getAmount() <= 0) { - shop.removeItem(stock); - MessagesManager.sendMessage(owner, Component.text("§aL'item a bien été retiré du shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - owner.closeInventory(); - return; - } - - int maxPlace = ItemUtils.getFreePlacesForItem(owner, stock.getItem()); - if (maxPlace <= 0) { - MessagesManager.sendMessage(owner, Component.text("§cVous n'avez pas assez de place"), Prefix.SHOP, MessageType.INFO, false); - owner.closeInventory(); - return; - } - - int toTake = Math.min(stock.getAmount(), maxPlace); - - ItemStack toGive = stock.getItem().clone(); - toGive.setAmount(toTake); - owner.getInventory().addItem(toGive); - stock.setAmount(stock.getAmount() - toTake); - - if (stock.getAmount() > 0) { - MessagesManager.sendMessage(owner, Component.text("§6Vous avez récupéré §a" + toTake + "§6 dans le stock de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } else { - MessagesManager.sendMessage(owner, Component.text("§6Vous avez récupéré le stock restant de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } - - // Mise à jour des suppliers - int toRemove = toTake; - Iterator> iterator = shop.getSuppliers().entrySet().iterator(); - while (iterator.hasNext() && toRemove > 0) { - Map.Entry entry = iterator.next(); - Supply supply = entry.getValue(); - - if (!supply.getItemId().equals(stock.getItemID())) continue; - - int supplyAmount = supply.getAmount(); - - if (supplyAmount <= toRemove) { - toRemove -= supplyAmount; - iterator.remove(); - } else { - supply.setAmount(supplyAmount - toRemove); - break; - } - } - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/company/Company.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/company/Company.java.bak index 5afb5e601..ed0b2c1e1 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/company/Company.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/company/Company.java.bak @@ -2,17 +2,17 @@ package fr.openmc.core.disabled.corporation.company; import fr.openmc.core.OMCPlugin; import fr.openmc.core.disabled.corporation.CorpPermission; -import fr.openmc.core.disabled.corporation.MethodState; -import fr.openmc.core.disabled.corporation.data.MerchantData; -import fr.openmc.core.disabled.corporation.data.TransactionData; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; +import fr.openmc.core.features.corporation.MethodState; +import fr.openmc.core.features.corporation.data.MerchantData; +import fr.openmc.core.features.corporation.data.TransactionData; +import fr.openmc.core.disabled.corporation.CompanyManager; +import fr.openmc.core.features.corporation.manager.ShopManager; import fr.openmc.core.disabled.corporation.models.DBCompany; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopOwner; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.CityPermission; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.features.corporation.shops.ShopOwner; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.utils.Queue; import fr.openmc.core.utils.SkullUtils; @@ -62,7 +62,7 @@ public class Company { addPermission(owner.getPlayer(), CorpPermission.OWNER); addMerchant(owner.getPlayer(), new MerchantData()); } - + // à revoir, je l'utilisais pour les entreprises de ville public Company(String name, CompanyOwner owner, UUID company_uuid, boolean newMember) { this.name = name; @@ -255,7 +255,7 @@ public class Company { return false; } - Shop newShop = new Shop(new ShopOwner(this), shopCounter); + Shop newShop = new Shop(new ShopOwner(), shopCounter); EconomyManager.withdrawBalance(whoCreated.getUniqueId(), 100); shops.add(newShop); diff --git a/src/main/java/fr/openmc/core/disabled/corporation/listener/CustomItemsCompanyListener.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/listener/CustomItemsCompanyListener.java.bak deleted file mode 100644 index 76506afc1..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/listener/CustomItemsCompanyListener.java.bak +++ /dev/null @@ -1,45 +0,0 @@ -package fr.openmc.core.disabled.corporation.listener; - -import dev.lone.itemsadder.api.CustomFurniture; -import dev.lone.itemsadder.api.Events.FurnitureBreakEvent; -import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; -import fr.openmc.core.disabled.corporation.menu.shop.ShopMenu; -import org.bukkit.Location; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -public class CustomItemsCompanyListener implements Listener { - - @EventHandler - public void onFurnitureBreak(FurnitureBreakEvent event){ - CustomFurniture furniture = event.getFurniture(); - - if (furniture!=null && furniture.getNamespacedID().equals("omc_company:caisse") && !event.getPlayer().isOp()){ - event.setCancelled(true); - } - } - - @EventHandler - public void onFurnitureInteract(FurnitureInteractEvent e){ - if (e.getFurniture() == null) { - return; - } - - if (e.getFurniture().getNamespacedID().equals("omc_company:caisse")){ - - double x = e.getFurniture().getEntity().getLocation().getBlockX(); - double y = e.getFurniture().getEntity().getLocation().getBlockY(); - double z = e.getFurniture().getEntity().getLocation().getBlockZ(); - - Shop shop = ShopBlocksManager.getShop(new Location(e.getFurniture().getEntity().getWorld(), x, y, z)); - if (shop == null) { - return; - } - e.setCancelled(true); - ShopMenu menu = new ShopMenu(e.getPlayer(), shop, 0); - menu.open(); - } - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/listener/ShopListener.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/listener/ShopListener.java.bak deleted file mode 100644 index 7b899a0f4..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/listener/ShopListener.java.bak +++ /dev/null @@ -1,209 +0,0 @@ -package fr.openmc.core.disabled.corporation.listener; - -import fr.openmc.core.disabled.corporation.CorpPermission; -import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; -import fr.openmc.core.disabled.corporation.menu.shop.ShopMenu; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.text.Component; -import org.bukkit.Material; -import org.bukkit.Tag; -import org.bukkit.block.Barrel; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockExplodeEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataType; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class ShopListener implements Listener { - - private final Map inShopBarrel = new HashMap<>(); - - @EventHandler - public void onShopBreak(BlockBreakEvent event) { - if (ShopBlocksManager.getShop(event.getBlock().getLocation()) != null) { - event.setCancelled(true); - } - } - - @EventHandler - public void onShopExplode(BlockExplodeEvent event){ - event.blockList().removeIf(block -> ShopBlocksManager.getShop(block.getLocation()) != null); - } - - @EventHandler - public void onEntityExplode(EntityExplodeEvent event) { - event.blockList().removeIf(block -> ShopBlocksManager.getShop(block.getLocation()) != null); - } - - @EventHandler - public void onShopClick(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { - return; - } - - // Check if the clicked block is a sign with tags - // Instead of getting the entire state of the block, - // This is much faster and avoids unnecessary overhead - if (!Tag.SIGNS.isTagged(event.getClickedBlock().getType())) - return; - - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) - return; - - Shop shop = ShopBlocksManager.getShop(event.getClickedBlock().getLocation()); - if (shop == null) - return; - - event.setCancelled(true); - ShopMenu menu = new ShopMenu(event.getPlayer(), shop, 0); - menu.open(); - } - - @EventHandler - public void onInteractWithBlock(PlayerInteractEvent e) { - Block block = e.getClickedBlock(); - if (block != null && block.getType() == Material.BARREL) { - Shop shop = ShopBlocksManager.getShop(block.getLocation()); - boolean isShop = shop!=null; - if (isShop){ - Company company = CompanyManager.getCompany(e.getPlayer().getUniqueId()); - if (company==null){ - if (shop.getOwner().getPlayer()==null){ - e.setCancelled(true); - return; - } - if (!shop.getOwner().getPlayer().equals(e.getPlayer().getUniqueId())){ - e.setCancelled(true); - return; - } - } else { - if (!company.hasShop(shop.getUuid())){ - e.setCancelled(true); - MessagesManager.sendMessage(e.getPlayer(), Component.text("Tu n'es pas dans l'entrprise possédant ce shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - - if (!company.hasPermission(e.getPlayer().getUniqueId(), CorpPermission.SUPPLY)){ - e.setCancelled(true); - MessagesManager.sendMessage(e.getPlayer(), Component.text("Tu n'as pas la permission de réapprovisionner le shop"), Prefix.SHOP, MessageType.INFO, false); - return; - } - } - } - inShopBarrel.put(e.getPlayer().getUniqueId(), isShop); - } - } - - @EventHandler - public void onShopPutItem(InventoryClickEvent e) { - UUID playerUUID = e.getWhoClicked().getUniqueId(); - if (inShopBarrel.getOrDefault(playerUUID, false)) { - Player player = (Player) e.getWhoClicked(); - Company company = CompanyManager.getCompany(playerUUID); - if (company!=null){ - if (!company.hasPermission(playerUUID, CorpPermission.SUPPLY)){ - MessagesManager.sendMessage(player, Component.text("Vous n'avez pas la permission de réapprovisionner les shops dans l'entreprise"), Prefix.SHOP, MessageType.INFO, false); - player.closeInventory(); - return; - } - } - - Inventory clickedInventory = e.getClickedInventory(); - - if (clickedInventory == null) return; - - if (clickedInventory.getHolder(false) instanceof Barrel) { - ItemStack currentItem = e.getCurrentItem(); - ItemStack cursorItem = e.getCursor(); - - if (e.isShiftClick() && isValidItem(currentItem)) { - removeSupplierKey(currentItem); - } - // Vérifier si un item est retiré - else if (e.getAction().name().contains("PICKUP") && isValidItem(currentItem)) { - removeSupplierKey(currentItem); - } - else if (e.getAction().name().contains("SWAP") && isValidItem(currentItem)) { - removeSupplierKey(currentItem); - } - // Vérifier si un item est placé avec la souris - else if (e.getAction().name().contains("PLACE") && isValidItem(cursorItem)) { - setSupplierKey(cursorItem, player.getUniqueId().toString()); - } - } else if (clickedInventory.getHolder(false) instanceof Player) { - ItemStack currentItem = e.getCurrentItem(); - - if (e.isShiftClick() && !e.getAction().name().contains("SWAP") && isValidItem(currentItem)) { - setSupplierKey(currentItem, player.getUniqueId().toString()); - } - } - } - } - - @EventHandler - public void onItemDrag(InventoryDragEvent e) { - UUID playerUUID = e.getWhoClicked().getUniqueId(); - if (inShopBarrel.getOrDefault(playerUUID, false) && e.getInventory().getHolder(false) instanceof Barrel) { - ItemStack item = e.getOldCursor(); - if (isValidItem(item)) { - removeSupplierKey(item); - } - } - } - - /** - * check if an item is valid - * - * @param item the item to check - * @return true if it's a valid item - */ - private boolean isValidItem(ItemStack item) { - return item != null && item.getType() != Material.AIR; - } - - /** - * add the SUPPLIER_KEY to an item - * - * @param item the item to add the key - * @param uuid the uuid of the player (the supplier_key) - */ - private void setSupplierKey(ItemStack item, String uuid) { - ItemMeta meta = item.getItemMeta(); - if (meta != null) { - meta.getPersistentDataContainer().set(CompanyManager.SUPPLIER_KEY, PersistentDataType.STRING, uuid); - item.setItemMeta(meta); - } - } - - /** - * remove the SUPPLIER_KEY to an item - * - * @param item the item to remove the key - */ - private void removeSupplierKey(ItemStack item) { - ItemMeta meta = item.getItemMeta(); - if (meta != null && meta.getPersistentDataContainer().has(CompanyManager.SUPPLIER_KEY)) { - meta.getPersistentDataContainer().remove(CompanyManager.SUPPLIER_KEY); - item.setItemMeta(meta); - } - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/manager/PlayerShopManager.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/manager/PlayerShopManager.java.bak deleted file mode 100644 index d893494e8..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/manager/PlayerShopManager.java.bak +++ /dev/null @@ -1,99 +0,0 @@ -package fr.openmc.core.disabled.corporation.manager; - -import fr.openmc.core.disabled.corporation.MethodState; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopOwner; -import fr.openmc.core.features.economy.EconomyManager; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.block.Block; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class PlayerShopManager { - - @Getter - private static final Map playerShops = new HashMap<>(); - - /** - * create a shop - * - * @param playerUUID the uuid of the player who creates it - * @param barrel the barrel block - * @param cashRegister the cash register - * @param shop_uuid the uuid of the shop if it already has one - * @return true if the shop has been created - */ - public static boolean createShop(UUID playerUUID, Block barrel, Block cashRegister, UUID shop_uuid) { - if (!EconomyManager.withdrawBalance(playerUUID, 500) && shop_uuid==null) { - return false; - } - Shop newShop; - if (shop_uuid != null) { - newShop = new Shop(new ShopOwner(playerUUID), 0, shop_uuid); - } else { - newShop = new Shop(new ShopOwner(playerUUID), 0); - } - - playerShops.put(playerUUID, newShop); - CompanyManager.shops.add(newShop); - ShopBlocksManager.registerMultiblock(newShop, - new Shop.Multiblock(barrel.getLocation(), cashRegister.getLocation())); - if (shop_uuid == null) { - ShopBlocksManager.placeShop(newShop, Bukkit.getPlayer(playerUUID), false); - } - return true; - } - - /** - * delete a shop - * - * @param playerUUID the uuid of the player who deletes the shop - * @return a Methode state - */ - public static MethodState deleteShop(UUID playerUUID) { - Shop shop = getPlayerShop(playerUUID); - if (!shop.getItems().isEmpty()) { - return MethodState.WARNING; - } - if (!ShopBlocksManager.removeShop(shop)) { - return MethodState.ESCAPE; - } - playerShops.remove(playerUUID); - CompanyManager.shops.remove(shop); - EconomyManager.addBalance(playerUUID, 400); - return MethodState.SUCCESS; - } - - /** - * get a shop from the uuid of a player - * - * @param playerUUID the uuid we check - * @return a shop if found - */ - public static Shop getPlayerShop(UUID playerUUID) { - return playerShops.get(playerUUID); - } - - /** - * get a shop from a shop uuid - * - * @param shop_uuid the uuid we check - * @return a shop if found - */ - public static Shop getShopByUUID(UUID shop_uuid) { - return playerShops.values().stream().filter(shop -> shop.getUuid().equals(shop_uuid)).findFirst().orElse(null); - } - - /** - * know if a player has a shop - * - * @param playerUUID the player to check - * @return true if a shop is found - */ - public static boolean hasShop(UUID playerUUID) { - return getPlayerShop(playerUUID) != null; - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/manager/ShopBlocksManager.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/manager/ShopBlocksManager.java.bak deleted file mode 100644 index bb3784ae4..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/manager/ShopBlocksManager.java.bak +++ /dev/null @@ -1,134 +0,0 @@ -package fr.openmc.core.disabled.corporation.manager; - -import fr.openmc.api.hooks.ItemsAdderHook; -import fr.openmc.core.OMCPlugin; -import fr.openmc.core.disabled.corporation.ItemsAdderIntegration; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.utils.world.WorldUtils; -import fr.openmc.core.utils.world.Yaw; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Directional; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class ShopBlocksManager { - - private static final Map multiblocks = new HashMap<>(); - private static final Map shopsByLocation = new HashMap<>(); - - /** - * Registers a shop's multiblock structure and maps its key locations. - * - * @param shop The shop to register. - * @param multiblock The multiblock structure associated with the shop. - */ - public static void registerMultiblock(Shop shop, Shop.Multiblock multiblock) { - multiblocks.put(shop.getUuid(), multiblock); - Location stockLoc = multiblock.stockBlock(); - Location cashLoc = multiblock.cashBlock(); - shopsByLocation.put(stockLoc, shop); - shopsByLocation.put(cashLoc, shop); - } - - /** - * Retrieves the multiblock structure associated with a given UUID. - * - * @param uuid The UUID of the shop. - * @return The multiblock structure if it exists, otherwise null. - */ - public static Shop.Multiblock getMultiblock(UUID uuid) { - return multiblocks.get(uuid); - } - - /** - * Retrieves a shop located at a given location. - * - * @param location The location to check. - * @return The shop found at that location, or null if none exists. - */ - public static Shop getShop(Location location) { - return shopsByLocation.get(location); - } - - /** - * Places the shop block (sign or ItemsAdder furniture) in the world, - * oriented based on the player's direction. - * - * @param shop The shop to place. - * @param player The player placing the shop. - * @param isCompany Whether the shop belongs to a company (unused here but may be relevant elsewhere). - */ - public static void placeShop(Shop shop, Player player, boolean isCompany) { - Shop.Multiblock multiblock = multiblocks.get(shop.getUuid()); - if (multiblock == null) { - return; - } - Block cashBlock = multiblock.cashBlock().getBlock(); - Yaw yaw = WorldUtils.getYaw(player); - - if (ItemsAdderHook.isHasItemAdder()) { - boolean placed = ItemsAdderIntegration.placeShopFurniture(cashBlock); - if (!placed) { - cashBlock.setType(Material.OAK_SIGN); - } - } else { - cashBlock.setType(Material.OAK_SIGN); - } - - BlockData cashData = cashBlock.getBlockData(); - if (cashData instanceof Directional directional) { - directional.setFacing(yaw.getOpposite().toBlockFace()); - cashBlock.setBlockData(directional); - } - } - - /** - * Removes a shop from the world and unregisters its multiblock structure. - * Handles both ItemsAdder and fallback vanilla types. - * - * @param shop The shop to remove. - * @return True if successfully removed, false otherwise. - */ - public static boolean removeShop(Shop shop) { - Shop.Multiblock multiblock = multiblocks.get(shop.getUuid()); - if (multiblock == null) { - return false; - } - Block cashBlock = multiblock.cashBlock().getBlock(); - Block stockBlock = multiblock.stockBlock().getBlock(); - - if (ItemsAdderHook.isHasItemAdder()) { - - if (!ItemsAdderIntegration.hasFurniture(cashBlock)) { - return false; - } - if (!ItemsAdderIntegration.removeShopFurniture(cashBlock)){ - return false; - } - - } else { - if (cashBlock.getType() != Material.OAK_SIGN && cashBlock.getType() != Material.BARRIER || stockBlock.getType() != Material.BARREL) { - return false; - } - } - - // Async cleanup of location mappings - multiblocks.remove(shop.getUuid()); - cashBlock.setType(Material.AIR); - new BukkitRunnable() { - @Override - public void run() { - shopsByLocation.entrySet().removeIf(entry -> entry.getValue().getUuid().equals(shop.getUuid())); - } - }.runTaskAsynchronously(OMCPlugin.getInstance()); - return true; - } - -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBaltopMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBaltopMenu.java.bak index b8a4474a8..340280e30 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBaltopMenu.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBaltopMenu.java.bak @@ -5,8 +5,8 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.data.MerchantData; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; +import fr.openmc.core.features.corporation.data.MerchantData; +import fr.openmc.core.disabled.corporation.CompanyManager; import fr.openmc.core.features.city.CityPermission; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.utils.SkullUtils; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBankTransactionsMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBankTransactionsMenu.java.bak index e15dbad2b..f0616daac 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBankTransactionsMenu.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyBankTransactionsMenu.java.bak @@ -7,7 +7,7 @@ import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.StaticSlots; import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.data.TransactionData; +import fr.openmc.core.features.corporation.data.TransactionData; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.items.CustomItemRegistry; import org.bukkit.Bukkit; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyMenu.java.bak index 916e4db31..956fac7fe 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyMenu.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanyMenu.java.bak @@ -6,7 +6,7 @@ import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.StaticSlots; import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.data.MerchantData; +import fr.openmc.core.features.corporation.data.MerchantData; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.items.CustomItemRegistry; import fr.openmc.core.utils.SkullUtils; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanySearchMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanySearchMenu.java.bak index 3a1187a00..6d1585b47 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanySearchMenu.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/CompanySearchMenu.java.bak @@ -7,7 +7,7 @@ import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.StaticSlots; import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; +import fr.openmc.core.disabled.corporation.CompanyManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.items.CustomItemRegistry; import org.bukkit.Material; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/ShopManageMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/ShopManageMenu.java.bak index c8f5c1a28..c5b0818c1 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/company/ShopManageMenu.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/menu/company/ShopManageMenu.java.bak @@ -6,8 +6,8 @@ import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; import fr.openmc.api.menulib.utils.StaticSlots; import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; -import fr.openmc.core.disabled.corporation.shops.Shop; +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.corporation.models.Shop; import fr.openmc.core.items.CustomItemRegistry; import net.kyori.adventure.text.Component; import org.bukkit.Material; diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopCatalogueMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopCatalogueMenu.java.bak deleted file mode 100644 index b5c8cf52d..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopCatalogueMenu.java.bak +++ /dev/null @@ -1,130 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.menulib.PaginatedMenu; -import fr.openmc.api.menulib.utils.InventorySize; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.api.menulib.utils.StaticSlots; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import fr.openmc.core.items.CustomItemRegistry; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ShopCatalogueMenu extends PaginatedMenu { - private final Shop shop; - private final int itemIndex; - - public ShopCatalogueMenu(Player owner, Shop shop, int itemIndex) { - super(owner); - this.shop = shop; - this.itemIndex = itemIndex; - } - - @Override - public @NotNull InventorySize getInventorySize() { - return InventorySize.LARGEST; - } - - @Override - public int getSizeOfItems() { - return getItems().size(); - } - - @Override - public @Nullable Material getBorderMaterial() { - return null; - } - - @Override - public @NotNull List getStaticSlots() { - return StaticSlots.getStandardSlots(getInventorySize()); - } - - @Override - public List getItems() { - List items = new ArrayList<>(); - - for (ShopItem shopItem : shop.getItems()){ - items.add(new ItemBuilder(this, shopItem.getItem().getType(), itemMeta -> { - itemMeta.displayName(ShopItem.getItemName(shopItem.getItem()).color(NamedTextColor.GRAY).decorate(TextDecoration.BOLD)); - }).setOnClick(inventoryClickEvent -> { - new ShopMenu(getOwner(), shop, getIndex(shopItem)).open(); - })); - } - - return items; - } - - @Override - public Map getButtons() { - Map buttons = new HashMap<>(); - buttons.put(49, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getItems().isEmpty()) { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cRetour")) - .setOnClick(inventoryClickEvent -> new ShopMenu(getOwner(), shop, itemIndex).open())); - buttons.put(50, nextPageButton); - } else { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cPage précédente")) - .setPreviousPageButton()); - buttons.put(50, nextPageButton.setNextPageButton()); - } - return buttons; - } - - @Override - public @NotNull String getName() { - return "Menu du shop " + shop.getName(); - } - - @Override - public String getTexture() { - return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); - } - - @Override - public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { - - } - - @Override - public void onClose(InventoryCloseEvent event) { - - } - - @Override - public List getTakableSlot() { - return List.of(); - } - - /** - * get the index of a ShopItem - * - * @param shopItem the ShopItem - * @return the index of the ShopItem - */ - private int getIndex(ShopItem shopItem) { - int index = 0; - for (ShopItem items : shop.getItems()){ - if (items==shopItem){ - return index; - } - index ++; - } - return index; - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopMenu.java.bak deleted file mode 100644 index dc23e139a..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopMenu.java.bak +++ /dev/null @@ -1,353 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.menulib.Menu; -import fr.openmc.api.menulib.defaultmenu.ConfirmMenu; -import fr.openmc.api.menulib.utils.InventorySize; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.disabled.corporation.MethodState; -import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.PlayerShopManager; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.items.CustomItemRegistry; -import fr.openmc.core.utils.ItemUtils; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BookMeta; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ShopMenu extends Menu { - - private final List items = new ArrayList<>(); - private final Shop shop; - private final int itemIndex; - - private int amountToBuy = 1; - - public ShopMenu(Player owner, Shop shop, int itemIndex) { - super(owner); - this.shop = shop; - this.itemIndex = itemIndex; - items.addAll(shop.getItems()); - Shop.checkStock(shop); - } - - @Override - public @NotNull String getName() { - return "Menu du shop " + shop.getName(); - } - - @Override - public String getTexture() { - // if (shop.getOwner().isCompany()){ -// Company company = shop.getOwner().getCompany(); -// if (company.getAllMembers().contains(getOwner().getUniqueId())){ -// return FontImageWrapper.replaceFontImages("§r§f:offset_-11::shop_menu:"); -// } -// } -// if (!shop.isOwner(getOwner().getUniqueId())) -// return FontImageWrapper.replaceFontImages("§r§f:offset_-11::shop_menu:"); - return FontImageWrapper.replaceFontImages("§r§f:offset_-11::shop_menu:"); - } - - @Override - public @NotNull InventorySize getInventorySize() { - return InventorySize.LARGER; - } - - @Override - public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { - - } - - @Override - public void onClose(InventoryCloseEvent event) { - - } - - @Override - public @NotNull Map getContent() { - Map content = new HashMap<>(); - Company company = null; - - if (shop.getOwner().isCompany()){ - company = shop.getOwner().getCompany(); - } - if ((company == null && shop.isOwner(getOwner().getUniqueId())) || (company != null && company.getAllMembers().contains(getOwner().getUniqueId()))) { - putOwnerItems(content); - } - - content.put(39, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> { - itemMeta.setDisplayName("§cItem précédent"); - }).setOnClick(inventoryClickEvent -> new ShopMenu(getOwner(), shop, onFirstItem() ? itemIndex : itemIndex - 1).open())); - - content.put(41, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_next_orange").getBest(), itemMeta -> { - itemMeta.setDisplayName("§aItem suivant"); - }).setOnClick(inventoryClickEvent -> new ShopMenu(getOwner(), shop, onLastItem() ? itemIndex : itemIndex + 1).open())); - - content.put(40, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_cancel").getBest(), itemMeta -> { - itemMeta.setDisplayName("§7Fermer"); - }).setCloseButton()); - - content.put(19, new ItemBuilder(this, CustomItemRegistry.getByName("omc_menus:minus_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§5Définir à 1"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - amountToBuy = 1; - open(); - })); - - content.put(20, new ItemBuilder(this, CustomItemRegistry.getByName("omc_company:10_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§cRetirer 10"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - if (amountToBuy == 1) return; - if (amountToBuy - 10 < 1) { - amountToBuy = 1; - } else { - amountToBuy -= 10; - } - open(); - })); - content.put(21, new ItemBuilder(this, CustomItemRegistry.getByName("omc_menus:1_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§cRetirer 1"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - if (amountToBuy == 1) return; - amountToBuy--; - open(); - })); - - if (getCurrentItem() != null) - content.put(22, new ItemBuilder(this, getCurrentItem().getItem(), itemMeta -> { - itemMeta.displayName(ItemUtils.getItemTranslation(getCurrentItem().getItem()).color(NamedTextColor.GRAY).decorate(TextDecoration.BOLD).decoration(TextDecoration.ITALIC, TextDecoration.State.FALSE)); - List lore = new ArrayList<>(); - lore.add("§7■ Prix: §c" + EconomyManager.getFormattedNumber(getCurrentItem().getPricePerItem() * amountToBuy)); - lore.add("§7■ En stock: " + EconomyManager.getFormattedSimplifiedNumber(getCurrentItem().getAmount())); - lore.add("§7■ Cliquez pour en acheter §f" + EconomyManager.getFormattedSimplifiedNumber(amountToBuy)); - itemMeta.setLore(lore); - }).setOnClick(inventoryClickEvent -> new ConfirmMenu(getOwner(), this::buyAccept, this::refuse, List.of(Component.text("§aAcheter")), List.of(Component.text("§cAnnuler l'achat"))).open())); - - content.put(23, new ItemBuilder(this, CustomItemRegistry.getByName("omc_menus:1_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§aAjouter 1"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - amountToBuy = getCurrentItem().getAmount()<=amountToBuy ? getCurrentItem().getAmount() : amountToBuy + 1; - open(); - })); - content.put(24, new ItemBuilder(this, CustomItemRegistry.getByName("omc_company:10_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§aAjouter 10"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - amountToBuy = getCurrentItem().getAmount()<=amountToBuy ? getCurrentItem().getAmount() : amountToBuy + 10; - open(); - })); - - content.put(25, new ItemBuilder(this, CustomItemRegistry.getByName("omc_menus:64_btn").getBest(), itemMeta -> { - itemMeta.setDisplayName("§5Ajouter 64"); - }).setOnClick(inventoryClickEvent -> { - if (getCurrentItem() == null) return; - if (amountToBuy == 1) amountToBuy = 64; - else amountToBuy = getCurrentItem().getAmount()<=amountToBuy ? getCurrentItem().getAmount() : amountToBuy + 64; - open(); - })); - - content.put(44, new ItemBuilder(this, CustomItemRegistry.getByName("omc_company:company_box").getBest(), itemMeta -> { - itemMeta.setDisplayName("§7Catalogue"); - }).setOnClick(inventoryClickEvent -> new ShopCatalogueMenu(getOwner(), shop, itemIndex).open())); - - return content; - } - - @Override - public List getTakableSlot() { - return List.of(); - } - - private void putOwnerItems(Map content) { - - content.put(0, new ItemBuilder(this, CustomItemRegistry.getByName("omc_homes:omc_homes_icon_bin_red").getBest(), itemMeta -> { - itemMeta.setDisplayName("§c§lSupprimer le shop"); - }).setOnClick(inventoryClickEvent -> new ConfirmMenu(getOwner(), this::accept, this::refuse, List.of(Component.text("§aSupprimer")), List.of(Component.text("§cAnnuler la suppression"))).open())); - - content.put(3, new ItemBuilder(this, Material.PAPER, itemMeta -> { - itemMeta.setDisplayName("§a§lVos ventes"); - List lore = new ArrayList<>(); - lore.add("§7■ Ventes: §f" + shop.getSales().size()); - lore.add("§7■ Cliquer pour voir vos ventes sur ce shop"); - itemMeta.setLore(lore); - }).setOnClick(inventoryClickEvent -> new ShopSalesMenu(getOwner(), shop, itemIndex).open())); - - content.put(4, shop.getIcon(this, true)); - - content.put(5, new ItemBuilder(this, Material.BARREL, itemMeta -> { - itemMeta.setDisplayName("§6§lVoir les stocks"); - List lore = new ArrayList<>(); - lore.add("§7■ Stocks: §f" + shop.getAllItemsAmount()); - lore.add("§7■ Cliquer pour voir les stocks de ce shop"); - itemMeta.setLore(lore); - }).setOnClick(inventoryClickEvent -> new ShopStocksMenu(getOwner(), shop, itemIndex).open())); - - content.put(8, new ItemBuilder(this, Material.LIME_WOOL, itemMeta -> { - itemMeta.setDisplayName("§aCe shop vous appartient"); - if (shop.getOwner().isCompany()) { - if (shop.getOwner().getCompany().getOwner().isCity()) { - itemMeta.setLore(List.of( - "§7■ Car vous faites partie de l'entreprise" - )); - } - } - })); - - content.put(36, new ItemBuilder(this, Material.WRITABLE_BOOK, itemMeta -> { - itemMeta.setDisplayName("§7Comment utiliser les shops"); - }).setOnClick(inventoryClickEvent -> { - - ItemStack book = new ItemStack(Material.WRITTEN_BOOK); - BookMeta meta = (BookMeta) book.getItemMeta(); - if (meta != null) { - meta.setTitle("Guide des Shop"); - meta.setAuthor("Nocolm"); - meta.addPage( - """ - Comment utiliser les shops ! - - §l§6Stock§r : - 1. Utilisez la commande §d§l/shop sell §r§7 §r en tenant l'item en main - 2. Ajoutez les items dans le barril §c§l* le raccourci avec les chiffres ne fonctionnera pas * - """ - ); - meta.addPage( - """ - 3. Ouvrez une fois le shop pour renouveler son stock - - Et voilà comment utiliser votre shops - - §6▪ Pour plus d'info : /shop help§r""" - ); - - book.setItemMeta(meta); - } - getOwner().closeInventory(); - getOwner().openBook(book); - - content.remove(44); - })); - } - - /** - * @return the current ShopItem - */ - private ShopItem getCurrentItem() { - if (itemIndex < 0 || itemIndex >= items.size()) { - return null; - } - return items.get(itemIndex); - } - - /** - * @return true if the menu is on the first item - */ - private boolean onFirstItem() { - return itemIndex == 0; - } - - /** - * @return true if the menu is on the last item - */ - private boolean onLastItem() { - return itemIndex == items.size() - 1; - } - - private void buyAccept() { - MethodState buyState = shop.buy(getCurrentItem(), amountToBuy, getOwner()); - if (buyState == MethodState.ERROR) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas assez d'argent pour acheter cet item"), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - return; - } - - if (buyState == MethodState.FAILURE) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVous ne pouvez pas acheter vos propres items"), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - return; - } - - if (buyState == MethodState.WARNING) { - MessagesManager.sendMessage(getOwner(), Component.text("§cIl n'y a pas assez de stock pour acheter cet item"), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - return; - } - if (buyState == MethodState.SPECIAL) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas assez de place dans votre inventaire"), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - return; - } - if (buyState == MethodState.ESCAPE) { - MessagesManager.sendMessage(getOwner(), Component.text("§cErreur lors de l'achat"), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - return; - } - MessagesManager.sendMessage(getOwner(), Component.text("§aVous avez bien acheté " + amountToBuy + " ").append( ItemUtils.getItemTranslation(getCurrentItem().getItem()).color(NamedTextColor.GREEN).decorate(TextDecoration.BOLD)).append(Component.text(" pour " + (getCurrentItem().getPricePerItem() * amountToBuy) + EconomyManager.getEconomyIcon())), Prefix.SHOP, MessageType.INFO, false); - getOwner().closeInventory(); - } - - private void accept () { - boolean isInCompany = CompanyManager.isInCompany(getOwner().getUniqueId()); - if (isInCompany) { - MethodState deleteState = CompanyManager.getCompany(getOwner().getUniqueId()).deleteShop(getOwner(), shop.getUuid()); - if (deleteState == MethodState.ERROR) { - MessagesManager.sendMessage(getOwner(), Component.text("§cCe shop n'existe pas dans votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.WARNING) { - MessagesManager.sendMessage(getOwner(), Component.text("§cCe shop n'est pas vide"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.SPECIAL) { - MessagesManager.sendMessage(getOwner(), Component.text("§cIl vous faut au minimum le nombre d'argent remboursable pour supprimer un shop et obtenir un remboursement dans la banque de votre entreprise"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (deleteState == MethodState.ESCAPE) { - MessagesManager.sendMessage(getOwner(), Component.text("§cCaisse introuvable (appelez un admin)"), Prefix.SHOP, MessageType.INFO, false); - } - MessagesManager.sendMessage(getOwner(), Component.text("§a" + shop.getName() + " a été supprimé !"), Prefix.SHOP, MessageType.INFO, false); - MessagesManager.sendMessage(getOwner(), Component.text("§6[Shop]§a +75" + EconomyManager.getEconomyIcon() + " de remboursés sur la banque de l'entreprise"), Prefix.SHOP, MessageType.INFO, false); - } - else { - MethodState methodState = PlayerShopManager.deleteShop(getOwner().getUniqueId()); - if (methodState == MethodState.WARNING) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVotre shop n'est pas vide"), Prefix.SHOP, MessageType.INFO, false); - return; - } - if (methodState == MethodState.ESCAPE) { - MessagesManager.sendMessage(getOwner(), Component.text("§cCaisse introuvable (appelez un admin)"), Prefix.SHOP, MessageType.INFO, false); - return; - } - MessagesManager.sendMessage(getOwner(), Component.text("§aVotre shop a bien été supprimé !"), Prefix.SHOP, MessageType.INFO, false); - MessagesManager.sendMessage(getOwner(), Component.text("§6[Shop]§a +400" + EconomyManager.getEconomyIcon() + " de remboursés sur votre compte personnel"), Prefix.SHOP, MessageType.INFO, false); - } - getOwner().closeInventory(); - } - - private void refuse() { - getOwner().closeInventory(); - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSalesMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSalesMenu.java.bak deleted file mode 100644 index 96f0a4878..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSalesMenu.java.bak +++ /dev/null @@ -1,114 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.menulib.PaginatedMenu; -import fr.openmc.api.menulib.utils.InventorySize; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.api.menulib.utils.StaticSlots; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.items.CustomItemRegistry; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ShopSalesMenu extends PaginatedMenu { - - private final Shop shop; - private final int itemIndex; - - public ShopSalesMenu(Player owner, Shop shop, int itemIndex) { - super(owner); - this.shop = shop; - this.itemIndex = itemIndex; - } - - @Override - public @NotNull InventorySize getInventorySize() { - return InventorySize.LARGEST; - } - - @Override - public int getSizeOfItems() { - return getItems().size(); - } - - @Override - public @Nullable Material getBorderMaterial() { - return null; - } - - @Override - public @NotNull List getStaticSlots() { - return StaticSlots.getStandardSlots(getInventorySize()); - } - - @Override - public List getItems() { - List items = new java.util.ArrayList<>(); - for (ShopItem sale : shop.getSales()) { - items.add(new ItemBuilder(this, sale.getItem().getType(), itemMeta -> { - itemMeta.displayName(ShopItem.getItemName(sale.getItem()).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)); - itemMeta.setLore(List.of( - "§7■ Prix : §a" + sale.getPrice() + EconomyManager.getEconomyIcon(), - "§7■ Quantité : §a" + sale.getAmount() - )); - })); - } - return items; - } - - @Override - public Map getButtons() { - Map buttons = new HashMap<>(); - buttons.put(49, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cRetour")) - .setOnClick(inventoryClickEvent -> new ShopMenu(getOwner(), shop, itemIndex).open())); - buttons.put(50, nextPageButton); - } else { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cPage précédente")) - .setPreviousPageButton()); - buttons.put(50, nextPageButton.setNextPageButton()); - } - return buttons; - } - - @Override - public @NotNull String getName() { - return "Ventes de " + shop.getName(); - } - - @Override - public String getTexture() { - return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); - } - - @Override - public void onClose(InventoryCloseEvent event) { - - } - - @Override - public List getTakableSlot() { - return List.of(); - } - - @Override - public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { - - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSearchMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSearchMenu.java.bak deleted file mode 100644 index 8834adecf..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopSearchMenu.java.bak +++ /dev/null @@ -1,170 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.input.DialogInput; -import fr.openmc.api.menulib.PaginatedMenu; -import fr.openmc.api.menulib.utils.InventorySize; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.api.menulib.utils.StaticSlots; -import fr.openmc.core.disabled.corporation.company.Company; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.items.CustomItemRegistry; -import fr.openmc.core.utils.ItemUtils; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static fr.openmc.core.utils.InputUtils.MAX_LENGTH; - -public class ShopSearchMenu extends PaginatedMenu { - - public ShopSearchMenu(Player owner) { - super(owner); - } - - @Override - public @NotNull InventorySize getInventorySize() { - return InventorySize.LARGEST; - } - - @Override - public int getSizeOfItems() { - return getItems().size(); - } - - @Override - public @Nullable Material getBorderMaterial() { - return null; - } - - @Override - public @NotNull List getStaticSlots() { - return StaticSlots.getStandardSlots(getInventorySize()); - } - - @Override - public List getItems() { - List items = new java.util.ArrayList<>(); - - for (Shop shops : CompanyManager.shops){ - - if (shops==null){continue;} - - List loc = new ArrayList<>(); - double x = ShopBlocksManager.getMultiblock(shops.getUuid()).stockBlock().getBlockX(); - double y = ShopBlocksManager.getMultiblock(shops.getUuid()).stockBlock().getBlockY(); - double z = ShopBlocksManager.getMultiblock(shops.getUuid()).stockBlock().getBlockZ(); - - loc.add(Component.text("§lLocation : §r x : " + x + " y : " + y + " z : " + z)); - - items.add(new ItemBuilder(this, ItemUtils.getPlayerHead(getOwner().getUniqueId()) ,itemMeta -> { - itemMeta.setDisplayName("§lshop :§r" + shops.getName()); - itemMeta.lore(loc); - })); - } - - return items; - } - - @Override - public Map getButtons() { - Map buttons = new HashMap<>(); - buttons.put(49, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - ItemBuilder searchButton = new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_search").getBest().getType(), itemMeta -> - itemMeta.setDisplayName("Rechercher")); - if ((getPage() != 0 && !isLastPage()) || !CompanyManager.getShops().isEmpty()) { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cPage précédente")) - .setPreviousPageButton()); - buttons.put(50, nextPageButton.setNextPageButton()); - buttons.put(45, searchButton.setOnClick(inventoryClick -> { - DialogInput.send(getOwner(), Component.text("Entrez le nom du shop ou bien du joueur pour le rechercher"), MAX_LENGTH, input -> { - if (input == null) return; - - boolean shopFind = false; - - for (Shop shop : CompanyManager.shops) { - double x = ShopBlocksManager.getMultiblock(shop.getUuid()).stockBlock().getBlockX(); - double y = ShopBlocksManager.getMultiblock(shop.getUuid()).stockBlock().getBlockY(); - double z = ShopBlocksManager.getMultiblock(shop.getUuid()).stockBlock().getBlockZ(); - - if (shop.getName().contains(input)) { - MessagesManager.sendMessage(getOwner(), Component.text("§lLocation du shop §a" + shop.getName() + " : §r x : " + x + " y : " + y + " z : " + z), Prefix.SHOP, MessageType.INFO, false); - shopFind = true; - break; - } - Player player = Bukkit.getPlayer(input); - if (player == null) continue; - if (shop.getOwner().isCompany()) { - Company company = shop.getOwner().getCompany(); - if (company.getAllMembers().contains(player.getUniqueId())) { - MessagesManager.sendMessage(getOwner(), Component.text("§lLocation du shop §a" + shop.getName() + " : §r x : " + x + " y : " + y + " z : " + z), Prefix.SHOP, MessageType.INFO, false); - shopFind = true; - break; - } - } - if (shop.getOwner().isPlayer()) { - Player shopPlayer = Bukkit.getPlayer(shop.getOwner().getPlayer()); - if (shopPlayer == null) { - continue; - } - if (shopPlayer.equals(player)) { - MessagesManager.sendMessage(getOwner(), Component.text("§lLocation du shop §a" + shop.getName() + " : §r x : " + x + " y : " + y + " z : " + z), Prefix.SHOP, MessageType.INFO, false); - shopFind = true; - break; - } - } - } - - if (!shopFind) { - MessagesManager.sendMessage(getOwner(), Component.text("§cAucun shop trouvé !"), Prefix.SHOP, MessageType.INFO, false); - } - - }); - })); - } - return buttons; - } - - @Override - public @NotNull String getName() { - return "§l§6Menu de Recherche de Shop"; - } - - @Override - public String getTexture() { - return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); - } - - @Override - public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { - - } - - @Override - public void onClose(InventoryCloseEvent event) { - - } - - @Override - public List getTakableSlot() { - return List.of(); - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopStocksMenu.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopStocksMenu.java.bak deleted file mode 100644 index 7f48f217b..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/menu/shop/ShopStocksMenu.java.bak +++ /dev/null @@ -1,188 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.menulib.PaginatedMenu; -import fr.openmc.api.menulib.defaultmenu.ConfirmMenu; -import fr.openmc.api.menulib.utils.InventorySize; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.api.menulib.utils.StaticSlots; -import fr.openmc.core.disabled.corporation.shops.Shop; -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import fr.openmc.core.disabled.corporation.shops.Supply; -import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.items.CustomItemRegistry; -import fr.openmc.core.utils.ItemUtils; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public class ShopStocksMenu extends PaginatedMenu { - - private final Shop shop; - private final int itemIndex; - private ShopItem stock; - private final List accetpMsg = new ArrayList<>(); - private final List denyMsg = new ArrayList<>(); - - public ShopStocksMenu(Player owner, Shop shop, int itemIndex) { - super(owner); - this.shop = shop; - this.itemIndex = itemIndex; - - accetpMsg.add(Component.text("§aRécupérer")); - denyMsg.add(Component.text("§cAnnuler")); - } - - @Override - public @NotNull InventorySize getInventorySize() { - return InventorySize.LARGEST; - } - - @Override - public int getSizeOfItems() { - return getItems().size(); - } - - @Override - public @Nullable Material getBorderMaterial() { - return null; - } - - @Override - public @NotNull List getStaticSlots() { - return StaticSlots.getStandardSlots(getInventorySize()); - } - - @Override - public List getItems() { - List items = new java.util.ArrayList<>(); - - for (ShopItem stock : shop.getItems()) { - items.add(new ItemBuilder(this, stock.getItem().getType(), itemMeta -> { - itemMeta.displayName(ShopItem.getItemName(stock.getItem()).color(NamedTextColor.GRAY).decorate(TextDecoration.BOLD)); - itemMeta.setLore(List.of( - "§7■ Quantité restante : " + EconomyManager.getFormattedSimplifiedNumber(stock.getAmount()), - "§7■ Prix de vente (par item) : " + EconomyManager.getFormattedNumber(stock.getPricePerItem()), - "§7" + (stock.getAmount() > 0 ? "■ Click gauche pour récupérer le stock" : "■ Click gauche pour retirer l'item de la vente") - )); - }).setOnClick(inventoryClickEvent -> { - this.stock = stock; - new ConfirmMenu(getOwner(),this::accept, this::refuse,accetpMsg, denyMsg).open(); - })); - } - return items; - } - - @Override - public Map getButtons() { - Map buttons = new HashMap<>(); - buttons.put(49, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cRetour")) - .setOnClick(inventoryClickEvent -> new ShopMenu(getOwner(), shop, itemIndex).open())); - buttons.put(50, nextPageButton); - } else { - buttons.put(48, new ItemBuilder(this, CustomItemRegistry.getByName("_iainternal:icon_back_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§cPage précédente")) - .setPreviousPageButton()); - buttons.put(50, nextPageButton.setNextPageButton()); - } - return buttons; - } - - @Override - public @NotNull String getName() { - return "Menu des Stocks de " + shop.getName(); - } - - @Override - public String getTexture() { - return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); - } - - @Override - public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { - - } - - @Override - public void onClose(InventoryCloseEvent event) { - - } - - @Override - public List getTakableSlot() { - return List.of(); - } - - private void accept() { - Player owner = getOwner(); - - if (stock.getAmount() <= 0) { - shop.removeItem(stock); - MessagesManager.sendMessage(owner, Component.text("§aL'item a bien été retiré du shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - owner.closeInventory(); - return; - } - - int maxPlace = ItemUtils.getFreePlacesForItem(owner, stock.getItem()); - if (maxPlace <= 0) { - MessagesManager.sendMessage(owner, Component.text("§cVous n'avez pas assez de place"), Prefix.SHOP, MessageType.INFO, false); - owner.closeInventory(); - return; - } - - int toTake = Math.min(stock.getAmount(), maxPlace); - - ItemStack toGive = stock.getItem().clone(); - toGive.setAmount(toTake); - owner.getInventory().addItem(toGive); - stock.setAmount(stock.getAmount() - toTake); - - if (stock.getAmount() > 0) { - MessagesManager.sendMessage(owner, Component.text("§6Vous avez récupéré §a" + toTake + "§6 dans le stock de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } else { - MessagesManager.sendMessage(owner, Component.text("§6Vous avez récupéré le stock restant de cet item"), Prefix.SHOP, MessageType.SUCCESS, false); - } - - // Mise à jour des suppliers - int toRemove = toTake; - Iterator> iterator = shop.getSuppliers().entrySet().iterator(); - while (iterator.hasNext() && toRemove > 0) { - Map.Entry entry = iterator.next(); - Supply supply = entry.getValue(); - - if (!supply.getItemId().equals(stock.getItemID())) continue; - - int supplyAmount = supply.getAmount(); - - if (supplyAmount <= toRemove) { - toRemove -= supplyAmount; - iterator.remove(); - } else { - supply.setAmount(supplyAmount - toRemove); - break; - } - } - - owner.closeInventory(); - } - - - private void refuse() { - getOwner().closeInventory(); - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShop.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/models/DBShop.java.bak deleted file mode 100644 index 8c5301c88..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShop.java.bak +++ /dev/null @@ -1,43 +0,0 @@ -package fr.openmc.core.disabled.corporation.models; - -import java.util.UUID; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; - -import lombok.Getter; - -@Getter -@DatabaseTable(tableName = "shops") -public class DBShop { - @DatabaseField(id = true) - private UUID id; - - @DatabaseField - private UUID owner; - @DatabaseField - private UUID city; - @DatabaseField - private UUID company; - - @DatabaseField(canBeNull = false) - private double x; - @DatabaseField(canBeNull = false) - private double y; - @DatabaseField(canBeNull = false) - private double z; - - DBShop() { - // required for ORMLite - } - - public DBShop(UUID id, UUID owner, UUID city, UUID company, double x, double y, double z) { - this.id = id; - this.owner = owner; - this.city = city; - this.company = company; - this.x = x; - this.y = y; - this.z = z; - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopItem.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopItem.java.bak deleted file mode 100644 index 14dc7367d..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopItem.java.bak +++ /dev/null @@ -1,46 +0,0 @@ -package fr.openmc.core.disabled.corporation.models; - -import java.util.UUID; - -import org.bukkit.inventory.ItemStack; - -import com.j256.ormlite.field.DataType; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; - -import fr.openmc.core.disabled.corporation.shops.ShopItem; -import lombok.Getter; - -@Getter -@DatabaseTable(tableName = "shop_items") -public class DBShopItem { - @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY) - private byte[] items; - @DatabaseField(canBeNull = false) - private UUID shop; - @DatabaseField(canBeNull = false) - private double price; - @DatabaseField(canBeNull = false) - private int amount; - @DatabaseField(canBeNull = false, columnName = "item_uuid") - private UUID itemUuid; - - DBShopItem() { - // required for ORMLite - } - - public DBShopItem(byte[] items, UUID shop, double price, int amount, UUID itemUuid) { - this.items = items; - this.shop = shop; - this.price = price; - this.amount = amount; - this.itemUuid = itemUuid; - } - - public ShopItem deserialize() { - ItemStack item = ItemStack.deserializeBytes(items); - ShopItem shopItem = new ShopItem(item, price, itemUuid); - shopItem.setAmount(amount); - return shopItem; - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/models/Merchant.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/models/Merchant.java.bak index a300b4cac..574806b3d 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/Merchant.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/models/Merchant.java.bak @@ -1,13 +1,12 @@ package fr.openmc.core.disabled.corporation.models; -import java.util.UUID; - import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; - import lombok.Getter; +import java.util.UUID; + @DatabaseTable(tableName = "merchants") public class Merchant { @DatabaseField(id = true) diff --git a/src/main/java/fr/openmc/core/disabled/corporation/models/ShopSupplier.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/models/ShopSupplier.java.bak deleted file mode 100644 index 8ba709e38..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/ShopSupplier.java.bak +++ /dev/null @@ -1,37 +0,0 @@ -package fr.openmc.core.disabled.corporation.models; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; - -import java.util.UUID; - -@DatabaseTable(tableName = "shop_suppliers") -@Getter -public class ShopSupplier { - @DatabaseField(id = true) - private UUID id; // différencie les supplier (un joueur peut avoir plusieurs suppliers) - @DatabaseField(canBeNull = false) - private UUID shop; - @DatabaseField(canBeNull = false) - private UUID item; - @DatabaseField(canBeNull = false) - private UUID player; - @DatabaseField(defaultValue = "0") - private int amount; - @DatabaseField(defaultValue = "0") - private long time; - - ShopSupplier() { - // required for ORMLite - } - - public ShopSupplier(UUID id, UUID shop, UUID item, UUID player, int amount, long time) { - this.id = id; - this.shop = shop; - this.item = item; - this.player = player; - this.amount = amount; - this.time = time; - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/shops/Shop.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/shops/Shop.java.bak index 6e2cae152..e69de29bb 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/shops/Shop.java.bak +++ b/src/main/java/fr/openmc/core/disabled/corporation/shops/Shop.java.bak @@ -1,447 +0,0 @@ -package fr.openmc.core.disabled.corporation.shops; - -import fr.openmc.api.menulib.Menu; -import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.disabled.corporation.MethodState; -import fr.openmc.core.disabled.corporation.manager.CompanyManager; -import fr.openmc.core.disabled.corporation.manager.ShopBlocksManager; -import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.utils.cache.CacheOfflinePlayer; -import fr.openmc.core.utils.ItemUtils; -import fr.openmc.core.utils.messages.MessageType; -import fr.openmc.core.utils.messages.MessagesManager; -import fr.openmc.core.utils.messages.Prefix; -import lombok.Getter; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Barrel; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; - -import java.util.*; - -@Getter -public class Shop { - - private final ShopOwner owner; - private final List items = new ArrayList<>(); - private final List sales = new ArrayList<>(); - private final Map suppliers = new HashMap<>(); - private final int index; - private final UUID uuid; - - private double turnover = 0; - - public Shop(ShopOwner owner, int index) { - this.owner = owner; - this.index = index; - this.uuid = UUID.randomUUID(); - } - - public Shop(ShopOwner owner, int index, UUID uuid) { - this.owner = owner; - this.index = index; - this.uuid = uuid; - } - - /** - * requirement : item need the uuid of the player who restock the shop - - * quand un item est vendu un partie du profit reviens a celui qui a approvisionner - * @param shop the shop we want to check the stock - */ - public static void checkStock(Shop shop) { - Multiblock multiblock = ShopBlocksManager.getMultiblock(shop.getUuid()); - - if (multiblock == null) { - return; - } - - Block stockBlock = multiblock.stockBlock().getBlock(); - if (stockBlock.getType() != Material.BARREL) { - ShopBlocksManager.removeShop(shop); - return; - } - - if (stockBlock.getState(false) instanceof Barrel barrel) { - - Inventory inventory = barrel.getInventory(); - for (ItemStack item : inventory.getContents()) { - if (item == null || item.getType() == Material.AIR) { - continue; - } - - ItemMeta itemMeta = item.getItemMeta(); - if (itemMeta == null) { - continue; - } - - PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); - if (dataContainer.has(CompanyManager.SUPPLIER_KEY, PersistentDataType.STRING)) { - - String supplierUUID = dataContainer.get(CompanyManager.SUPPLIER_KEY, PersistentDataType.STRING); - if (supplierUUID == null) { - continue; - } - - List possibleSuppliers = new ArrayList<>(); - if (shop.getOwner().isCompany()) { - possibleSuppliers.addAll(shop.getOwner().getCompany().getAllMembers()); - } - - if (shop.getOwner().isPlayer()) { - possibleSuppliers.add(shop.getOwner().getPlayer()); - } - - if (!possibleSuppliers.contains(UUID.fromString(supplierUUID))) { - continue; - } - boolean supplied = shop.supply(item, UUID.fromString(supplierUUID)); - if (supplied) inventory.remove(item); - } - } - } - } - - - public String getName() { - return owner.isCompany() ? ("Shop #" + index) : CacheOfflinePlayer.getOfflinePlayer(owner.getPlayer()).getName() + "'s Shop"; - } - - public UUID getSupremeOwner() { - return owner.isCompany() ? owner.getCompany().getOwner().getPlayer() : owner.getPlayer(); - } - - /** - * know if the uuid is the shop owner - * - * @param uuid the uuid we check - */ - public boolean isOwner(UUID uuid) { - if (owner.isCompany()) { - return owner.getCompany().isOwner(uuid); - } - return owner.getPlayer().equals(uuid); - } - - /** - * add an item to the shop - * - * @param itemStack the item - * @param price the price - * @param amount the amount of it - */ - public boolean addItem(ItemStack itemStack, double price, int amount, UUID itemID) { - - ShopItem item = itemID == null ? new ShopItem(itemStack, price) : new ShopItem(itemStack, price, itemID); - for (ShopItem shopItem : items) { - if (shopItem.getItem().isSimilar(itemStack)) { - return true; - } - } - if (amount>1){ - item.setAmount(amount); - } - items.add(item); - return false; - } - - public void addItem(ShopItem item){ - items.add(item); - } - - public void addSales(ShopItem item){ - sales.add(item); - } - - /** - * get an item from the shop - * - * @param index index of the item - */ - public ShopItem getItem(int index) { - return items.get(index); - } - - /** - * remove an item from the shop - * - * @param item the item to remove - */ - public void removeItem(ShopItem item) { - items.remove(item); - suppliers.entrySet().removeIf(entry -> entry.getValue().getItemId().equals(item.getItemID())); - } - - public int recoverItemOf(ShopItem item, Player supplier) { - int amount = item.getAmount(); - - if (ItemUtils.getFreePlacesForItem(supplier,item.getItem()) < amount){ - MessagesManager.sendMessage(supplier, Component.text("§cVous n'avez pas assez de place"), Prefix.SHOP, MessageType.INFO, false); - return 0; - } - - int toRemove = 0; - - Iterator> iterator = suppliers.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - if (entry.getValue().getSupplierUUID().equals(supplier.getUniqueId())) { - if (entry.getValue().getItemId().equals(item.getItemID())){ - amount -= entry.getValue().getAmount(); - toRemove += entry.getValue().getAmount(); - if (amount >= 0){ - iterator.remove(); - } - else { - break; - } - } - } - } - - if (amount == 0){ - items.remove(item); - MessagesManager.sendMessage(supplier, Component.text("§aL'item a bien été retiré du shop !"), Prefix.SHOP, MessageType.SUCCESS, false); - } else { - item.setAmount(amount); - } - - return toRemove; - } - - /** - * update the amount of all the item in the shop according to the items in the barrel - */ - public boolean supply(ItemStack item, UUID supplier) { - for (ShopItem shopItem : items) { - if (shopItem.getItem().getType().equals(item.getType())) { - int delay = 0; - shopItem.setAmount(shopItem.getAmount() + item.getAmount()); - while (suppliers.containsKey(System.currentTimeMillis() + delay)){ - delay ++; - } - suppliers.put(System.currentTimeMillis() + delay, new Supply(supplier, shopItem.getItemID(), item.getAmount())); - return true; - } - } - return false; - } - - public void addSupply(long time, Supply supply){ - suppliers.put(time, supply); - } - - - /** - * buy an item in the shop - * - * @param item the item to buy - * @param amountToBuy the amount of it - * @param buyer the player who buys - * @return a MethodState - */ - public MethodState buy(ShopItem item, int amountToBuy, Player buyer) { - if (!ItemUtils.hasAvailableSlot(buyer)) { - return MethodState.SPECIAL; - } - if (amountToBuy > item.getAmount()) { - return MethodState.WARNING; - } - if (isOwner(buyer.getUniqueId())) { - return MethodState.FAILURE; - } - if (!EconomyManager.withdrawBalance(buyer.getUniqueId(), item.getPrice(amountToBuy))) return MethodState.ERROR; - double basePrice = item.getPrice(amountToBuy); - turnover += item.getPrice(amountToBuy); - - if (owner.isCompany()) { - - double price = item.getPrice(amountToBuy);// prix total - - double companyCut = price * owner.getCompany().getCut();// prix après cut - - double suppliersCut = price - companyCut;// prix restant - - boolean supplied = false; - - List supplies = new ArrayList<>(); - for (Map.Entry entry : suppliers.entrySet()) { - if (entry.getValue().getItemId().equals(item.getItemID())) { - supplies.add(entry.getValue()); - } - } - - Map forSupplies = new HashMap<>(); - - if (!supplies.isEmpty()) { - - supplied = true; - - for (Supply supply : supplies) { - int suppliesAmount = supply.getAmount(); - - if (amountToBuy == suppliesAmount){// si la quantité achetée correspond au suppliesAmount ( ex : 32 = 32 ) - EconomyManager.addBalance(supply.getSupplier(), suppliersCut);// ajoutez prix restant - - if (forSupplies.containsKey(supply.getSupplier())){ - double supCut = forSupplies.get(supply.getSupplier()); - forSupplies.replace(supply.getSupplier(), supCut + suppliersCut); - } else { - forSupplies.put(supply.getSupplier(), suppliersCut); - } - removeLatestSupply();// retirer le supplier - break;// arrêter la boucle - } - - if (amountToBuy < suppliesAmount){// si la quantité achetée est inférieure au suppliesAmount ( ex : 32 < 64 ) - EconomyManager.addBalance(supply.getSupplier(), suppliersCut); - suppliesAmount -= amountToBuy; - supply.setAmount(suppliesAmount); - - if (forSupplies.containsKey(supply.getSupplier())){ - double supCut = forSupplies.get(supply.getSupplier()); - forSupplies.replace(supply.getSupplier(), supCut + suppliersCut); - } else { - forSupplies.put(supply.getSupplier(), suppliersCut); - } - break; - } - - else {// si la quantité achetée est supérieur au suppliesAmount ( ex : 64 > 32 ) - double supplierCut = (suppliesAmount * suppliersCut) / amountToBuy; - suppliersCut -= supplierCut; - amountToBuy -= suppliesAmount; - EconomyManager.addBalance(supply.getSupplier(), supplierCut); - - if (forSupplies.containsKey(supply.getSupplier())){ - double supCut = forSupplies.get(supply.getSupplier()); - forSupplies.replace(supply.getSupplier(), supCut + supplierCut); - } else { - forSupplies.put(supply.getSupplier(), supplierCut); - } - removeLatestSupply(); - } - - } - } - - if (!supplied) { - return MethodState.ESCAPE; - } - - for (Map.Entry entry : forSupplies.entrySet()) { - UUID supplier = entry.getKey(); - double supplierCut = entry.getValue(); - - Player player = Bukkit.getPlayer(supplier); - if (player!=null){ - MessagesManager.sendMessage(player, Component.text(buyer.getName() + " a acheté " + amountToBuy + " " + item.getItem().getType() + " pour " + basePrice + EconomyManager.getEconomyIcon() + ", vous avez reçu : " + supplierCut + EconomyManager.getEconomyIcon()), Prefix.SHOP, MessageType.SUCCESS, false); - } - } - - owner.getCompany().depositWithoutWithdraw(companyCut, buyer, "Vente", getName()); - } - - else { - EconomyManager.addBalance(owner.getPlayer(), item.getPrice(amountToBuy)); - Player player = Bukkit.getPlayer(owner.getPlayer()); - if (player!=null){ - MessagesManager.sendMessage(player, Component.text(buyer.getName() + " a acheté " + amountToBuy + " " + item.getItem().getType() + " pour " + item.getPrice(amountToBuy) + EconomyManager.getEconomyIcon() + ", l'argent vous a été transféré !"), Prefix.SHOP, MessageType.SUCCESS, false); - } - } - - ItemStack toGive = item.getItem().clone(); - toGive.setAmount(amountToBuy); - - List stacks = ItemUtils.splitAmountIntoStack(toGive); - for (ItemStack stack : stacks) { - buyer.getInventory().addItem(stack); - } - - sales.add(item.copy().setAmount(amountToBuy)); - item.setAmount(item.getAmount() - amountToBuy); - - return MethodState.SUCCESS; - } - - private void removeLatestSupply() { - long latest = 0; - Supply supply = null; - for (Map.Entry entry : suppliers.entrySet()) { - if (entry.getKey() > latest) { - latest = entry.getKey(); - supply = entry.getValue(); - } - } - if (supply != null) { - suppliers.remove(latest); - } - } - - public boolean isSupplier(UUID playerUUID){ - for (Map.Entry entry : suppliers.entrySet()) { - if (entry.getValue().getSupplierUUID().equals(playerUUID)){ - return true; - } - } - return false; - } - - /** - * get the shop Icon - * - * @param menu the menu - * @param fromShopMenu know if it from shopMenu - */ - public ItemBuilder getIcon(Menu menu, boolean fromShopMenu) { - return new ItemBuilder(menu, fromShopMenu ? Material.GOLD_INGOT : Material.BARREL, itemMeta -> { - itemMeta.setDisplayName("§e§l" + (fromShopMenu ? "Informations" : getName())); - List lore = new ArrayList<>(); - lore.add("§7■ Chiffre d'affaire : " + EconomyManager.getFormattedNumber(turnover)); - lore.add("§7■ Ventes : §f" + sales.size()); - if (!fromShopMenu) - lore.add("§7■ Cliquez pour accéder au shop"); - itemMeta.setLore(lore); - }); - } - - public int getAllItemsAmount() { - int amount = 0; - for (ShopItem item : items) { - amount += item.getAmount(); - } - return amount; - } - - /** - * get the shop with what player looking - * - * @param player the player we check - * @param onlyCash if we only check the cach register - */ - public static UUID getShopPlayerLookingAt(Player player, boolean onlyCash) { - Block targetBlock = player.getTargetBlockExact(5); - - if (targetBlock == null) return null; - - if (targetBlock.getType() != Material.BARREL && targetBlock.getType() != Material.OAK_SIGN && targetBlock.getType() != Material.BARRIER) return null; - if (onlyCash) { - if (targetBlock.getType() != Material.OAK_SIGN && targetBlock.getType() != Material.BARRIER) return null; - } - Shop shop = ShopBlocksManager.getShop(targetBlock.getLocation()); - if (shop == null) return null; - return shop.getUuid(); - } - - public record Multiblock(Location stockBlock, Location cashBlock) { - - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopItem.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopItem.java.bak deleted file mode 100644 index 0308f61a7..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopItem.java.bak +++ /dev/null @@ -1,87 +0,0 @@ -package fr.openmc.core.disabled.corporation.shops; - -import fr.openmc.core.utils.ItemUtils; -import lombok.Getter; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.UUID; - -@Getter -public class ShopItem { - - private final UUID itemID; - private final ItemStack item; - private final double pricePerItem; - private double price; - private int amount; - - public ShopItem(ItemStack item, double pricePerItem) { - this.item = item.clone(); - this.pricePerItem = pricePerItem; - this.item.setAmount(1); - this.price = pricePerItem * amount; - this.amount = 0; - this.itemID = UUID.randomUUID(); - } - - public ShopItem(ItemStack item, double pricePerItem, UUID itemID) { - this.item = item.clone(); - this.pricePerItem = pricePerItem; - this.item.setAmount(1); - this.price = pricePerItem * amount; - this.amount = 0; - this.itemID = itemID; - } - - /** - * get the name of an item - * - * @param amount the new amount of the item - * @return default the ShopItem - */ - public ShopItem setAmount(int amount) { - this.amount = amount; - this.price = pricePerItem * amount; - return this; - } - - /** - * copy an ShopItem - * - * @return a copy of the ShopItem - */ - public ShopItem copy() { - return new ShopItem(item.clone(), pricePerItem); - } - - /** - * get the price of a certain amount of an item - * - * @param amount amount of item - * @return a price - */ - public double getPrice(int amount) { - return pricePerItem * amount; - } - - /** - * get the name of an item - * - * @param itemStack the item - * @return default name if the item has no custom name - */ - public static Component getItemName(ItemStack itemStack) { - if (itemStack.hasItemMeta()) { - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta.hasDisplayName()) { - return itemMeta.displayName(); - } - } - // If no custom name, return default name - return ItemUtils.getItemTranslation(itemStack).color(NamedTextColor.GRAY).decorate(TextDecoration.BOLD); - } -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopOwner.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopOwner.java.bak deleted file mode 100644 index bdd5493d4..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/shops/ShopOwner.java.bak +++ /dev/null @@ -1,47 +0,0 @@ -package fr.openmc.core.disabled.corporation.shops; - -import fr.openmc.core.disabled.corporation.company.Company; -import lombok.Getter; - -import java.util.UUID; - -@Getter -public class ShopOwner { - - private final Company company; - private final UUID player; - - /** - * ShopOwner for a company or a player - * @param company to set a company as the owner - */ - - public ShopOwner(Company company) { - this.company = company; - this.player = null; - } - - /** - * ShopOwner for a company or a player - * @param owner to set a player as the owner - */ - public ShopOwner(UUID owner) { - this.company = null; - this.player = owner; - } - - /** - * know if it's a company - */ - public boolean isCompany() { - return company != null; - } - - /** - * know if it's a player - */ - public boolean isPlayer() { - return player != null; - } - -} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/shops/Supply.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/shops/Supply.java.bak deleted file mode 100644 index 7091aed94..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/shops/Supply.java.bak +++ /dev/null @@ -1,30 +0,0 @@ -package fr.openmc.core.disabled.corporation.shops; - -import lombok.Getter; -import lombok.Setter; - -import java.util.UUID; - -@Getter -public class Supply { - - private final UUID supplier; - private final UUID itemId; - private final UUID supplierUUID; - @Setter - private int amount; - - public Supply(UUID supplier, UUID itemId, int amount) { - this.supplier = supplier; - this.itemId = itemId; - this.amount = amount; - this.supplierUUID = UUID.randomUUID(); - } - - public Supply(UUID supplier, UUID itemId, int amount, UUID supplierUUID) { - this.supplier = supplier; - this.itemId = itemId; - this.amount = amount; - this.supplierUUID = supplierUUID; - } -} diff --git a/src/main/java/fr/openmc/core/features/city/conditions/CityCreateConditions.java b/src/main/java/fr/openmc/core/features/city/conditions/CityCreateConditions.java index 1211dd44d..fde71b351 100644 --- a/src/main/java/fr/openmc/core/features/city/conditions/CityCreateConditions.java +++ b/src/main/java/fr/openmc/core/features/city/conditions/CityCreateConditions.java @@ -52,7 +52,7 @@ public static boolean canCityCreate(Player player, String cityName) { } if (cityName != null && !InputUtils.isInputCityName(cityName)) { - MessagesManager.sendMessage(player, Component.text("Le nom de ville est invalide, il doit contenir uniquement des caractères alphanumerique et doit faire moins de 24 caractères"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.text("Le nom de ville est invalide, il doit contenir uniquement des caractères alphanumériques et doit faire moins de 24 caractères"), Prefix.CITY, MessageType.ERROR, false); return false; } diff --git a/src/main/java/fr/openmc/core/disabled/corporation/MethodState.java.bak b/src/main/java/fr/openmc/core/features/corporation/MethodState.java similarity index 74% rename from src/main/java/fr/openmc/core/disabled/corporation/MethodState.java.bak rename to src/main/java/fr/openmc/core/features/corporation/MethodState.java index daecc69cf..9df6ca207 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/MethodState.java.bak +++ b/src/main/java/fr/openmc/core/features/corporation/MethodState.java @@ -1,4 +1,4 @@ -package fr.openmc.core.disabled.corporation; +package fr.openmc.core.features.corporation; import lombok.Getter; @@ -10,5 +10,4 @@ public enum MethodState { FAILURE, ESCAPE, SPECIAL - } diff --git a/src/main/java/fr/openmc/core/features/corporation/ShopFurniture.java b/src/main/java/fr/openmc/core/features/corporation/ShopFurniture.java new file mode 100644 index 000000000..3716966c1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/ShopFurniture.java @@ -0,0 +1,34 @@ +package fr.openmc.core.features.corporation; + +import dev.lone.itemsadder.api.CustomFurniture; +import dev.lone.itemsadder.api.CustomStack; +import fr.openmc.core.utils.world.Yaw; +import org.bukkit.Material; +import org.bukkit.block.Block; + +public class ShopFurniture { + + public static boolean placeShopFurniture(Block block, Yaw playerYaw) { + CustomStack customFurniture = CustomFurniture.getInstance("omc_company:caisse"); + if (customFurniture == null || block.getType() != Material.AIR) return false; + + CustomFurniture furniture = CustomFurniture.spawn("omc_company:caisse", block); + furniture.getEntity().setRotation(playerYaw.getPlayerYaw(), 0); + return true; + } + + public static boolean removeShopFurniture(Block block) { + CustomStack placed = CustomFurniture.byAlreadySpawned(block); + if (placed == null || !placed.getNamespacedID().equals("omc_company:caisse")) + return false; + + CustomFurniture.remove(CustomFurniture.byAlreadySpawned(block).getEntity(), false); + return true; + } + + public static boolean hasFurniture(Block block) { + CustomStack placed = CustomFurniture.byAlreadySpawned(block); + return placed != null && placed.getNamespacedID().equals("omc_company:caisse"); + } + +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/corporation/commands/ShopAdminCommand.java b/src/main/java/fr/openmc/core/features/corporation/commands/ShopAdminCommand.java new file mode 100644 index 000000000..47154d558 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/commands/ShopAdminCommand.java @@ -0,0 +1,99 @@ +package fr.openmc.core.features.corporation.commands; + +import fr.openmc.core.features.corporation.commands.autocomplete.ShopAdminCommandPlayerAutocomplete; +import fr.openmc.core.features.corporation.manager.PlayerShopManager; +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.*; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +@Command("shopadmin") +@CommandPermission("omc.admins.commands.shop") +public class ShopAdminCommand { + + @Subcommand("database query shops") + public void databaseQueryShops(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + if (playerShop == null) { + if (ShopManager.loadShops()) { + MessagesManager.sendMessage(player, Component.text("§aChargement des shops depuis la base de données réussi"), Prefix.SHOP, MessageType.SUCCESS, false); + } else { + MessagesManager.sendMessage(player, Component.text("§cÉchec du chargement des shops depuis la base de données (Error in console)"), Prefix.SHOP, MessageType.ERROR, false); + } + } else { + if (ShopManager.loadShopFor(playerShop)) { + MessagesManager.sendMessage(player, Component.text("§aChargement du shop du joueur §6" + playerShop.getName() + "§a depuis la base de données réussi"), Prefix.SHOP, MessageType.SUCCESS, false); + } else { + MessagesManager.sendMessage(player, Component.text("§cÉchec du chargement du shop du joueur §6" + playerShop.getName() + "§c depuis la base de données (Error in console)"), Prefix.SHOP, MessageType.ERROR, false); + } + } + } + + @Subcommand("database query shop_sales") + public void databaseQueryShopSales(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + + } + + @Subcommand("database query shop_items") + public void databaseQueryShopItems(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + + } + + @Subcommand("database save shops") + public void databaseSaveShops(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + if (playerShop == null) { + if (ShopManager.saveShops()) { + MessagesManager.sendMessage(player, Component.text("§aSauvegarde des shops dans la base de données réussi"), Prefix.SHOP, MessageType.SUCCESS, false); + } else { + MessagesManager.sendMessage(player, Component.text("§cÉchec de la sauvegarde des shops dans la base de données (Error in console)"), Prefix.SHOP, MessageType.ERROR, false); + } + } else { + if (ShopManager.saveShopFor(playerShop)) { + MessagesManager.sendMessage(player, Component.text("§aSauvegarde du shop du joueur §6" + playerShop.getName() + "§a dans la base de données réussi"), Prefix.SHOP, MessageType.SUCCESS, false); + } else { + MessagesManager.sendMessage(player, Component.text("§cÉchec de la sauvegarde du shop du joueur §6" + playerShop.getName() + "§c dans la base de données (Error in console)"), Prefix.SHOP, MessageType.ERROR, false); + } + } + } + + @Subcommand("database save shop_sales") + public void databaseSaveShopSales(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + + } + + @Subcommand("database save shop_items") + public void databaseSaveShopItems(Player player, @Optional @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop) { + + } + + @Subcommand("removeshop") + public void removeShop(Player player, @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer target) { + if (target == null) { + MessagesManager.sendMessage(player, Component.text("§cLe joueur spécifié est introuvable"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + if (!ShopManager.hasShop(target.getUniqueId())) { + MessagesManager.sendMessage(player, Component.text("§cLe joueur spécifié n'a pas de shop"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + Shop shop = ShopManager.getPlayerShop(target.getUniqueId()); + if (shop == null) { + MessagesManager.sendMessage(player, Component.text("§cLe shop du joueur spécifié est introuvable"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + if (!shop.getItems().isEmpty()) { + MessagesManager.sendMessage(player, Component.text("§cLe shop du joueur spécifié n'est pas vide"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + PlayerShopManager.adminDeleteShop(target, player); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/commands/ShopCommand.java b/src/main/java/fr/openmc/core/features/corporation/commands/ShopCommand.java new file mode 100644 index 000000000..5729dff79 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/commands/ShopCommand.java @@ -0,0 +1,89 @@ +package fr.openmc.core.features.corporation.commands; + +import fr.openmc.core.features.corporation.manager.PlayerShopManager; +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.corporation.menu.ShopMenu; +import fr.openmc.core.features.corporation.menu.ShopSearchMenu; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.*; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +@Command("shop") +@Description("Manage shops") +@CommandPermission("omc.commands.shop") +public class ShopCommand { + + @CommandPlaceholder + public void onCommand(Player player) { + if (!ShopManager.hasShop(player.getUniqueId())) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.INFO, false); + return; + } + new ShopMenu(player).open(); + } + + @Subcommand("help") + @Description("Explique comment marche un shop") + @Cooldown(30) + public void help(Player player) { + MessagesManager.sendMessage(player, Component.text(""" + §6§lListe des commandes shop : + + §e▪ /shop create§7 - Crée un shop si vous regardez un tonneau + §e▪ /shop sell §7 - Permet de mettre en vente l'item dans votre main + §e▪ /shop unsell§7 - Permet de retirer de la vente l'item que vous tenez en main + §e▪ /shop delete§7 - Permet de supprimer votre shop en le regardant + §e▪ /shop search§7 - Permet de rechercher des shops par leur nom ou le nom du joueur + """), + Prefix.SHOP, MessageType.INFO, false); + } + + @Subcommand("sell") + @Description("Sell an item in a shop") + public void sellItem(Player player, @Named("price") double price) { + + } + + @Subcommand("create") + @Description("Create a shop") + public void createShop(Player player) { + if (ShopManager.hasShop(player.getUniqueId())) { + MessagesManager.sendMessage(player, Component.text("§cVous avez déjà un shop"), Prefix.SHOP, MessageType.INFO, false); + return; + } + if (! EconomyManager.hasEnoughMoney(player.getUniqueId(), 500)) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez d'argent pour créer un shop (500" + EconomyManager.getEconomyIcon() + " nécessaires)"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + PlayerShopManager.startCreatingShop(player); + } + + @Subcommand("unsell") + @Description("Unsell an item of a shop") + public void unsellItem(Player player, @Named("item number") int itemIndex) { + + } + + @Subcommand("delete") + @Description("Delete a shop") + public void deleteShop(Player player) { + if (!ShopManager.hasShop(player.getUniqueId())) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop"), Prefix.SHOP, MessageType.WARNING, false); + return; + } + + PlayerShopManager.deleteShop(player, false); + } + + @Subcommand("search") + @Description("Recherche un shop") + public void searchShop(Player player){ + new ShopSearchMenu(player).open(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java b/src/main/java/fr/openmc/core/features/corporation/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java new file mode 100644 index 000000000..f1b20d4c2 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java @@ -0,0 +1,24 @@ +package fr.openmc.core.features.corporation.commands.autocomplete; + +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +public class ShopAdminCommandPlayerAutocomplete implements SuggestionProvider { + @Override + public @NotNull Set getSuggestions(@NotNull ExecutionContext context) { + Set shops = ShopManager.getAllShops(); + return shops.stream() + .map(shop -> CacheOfflinePlayer.getOfflinePlayer(shop.getOwnerUUID()).getName()) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/listener/ShopListener.java b/src/main/java/fr/openmc/core/features/corporation/listener/ShopListener.java new file mode 100644 index 000000000..f56eb2780 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/listener/ShopListener.java @@ -0,0 +1,121 @@ +package fr.openmc.core.features.corporation.listener; + +import dev.lone.itemsadder.api.CustomFurniture; +import dev.lone.itemsadder.api.Events.FurnitureBreakEvent; +import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.corporation.menu.ShopMenu; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class ShopListener implements Listener { + + private final Map inShopBarrel = new HashMap<>(); + + @EventHandler + public void onShopBreak(BlockBreakEvent event) { + if (ShopManager.getShopAt(event.getBlock().getLocation()) != null) event.setCancelled(true); + } + + @EventHandler + public void onShopExplode(BlockExplodeEvent event){ + event.blockList().removeIf(block -> ShopManager.getShopAt(block.getLocation()) != null); + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + event.blockList().removeIf(block -> ShopManager.getShopAt(block.getLocation()) != null); + } + + @EventHandler + public void onShopClick(PlayerInteractEvent event) { + if (event.getClickedBlock() == null) return; + + // Check if the clicked block is a sign with tags + // Instead of getting the entire state of the block + // This is much faster and avoids unnecessary overhead + if (!Tag.SIGNS.isTagged(event.getClickedBlock().getType())) return; + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + + Shop shop = ShopManager.getShopAt(event.getClickedBlock().getLocation()); + if (shop == null) return; + + event.setCancelled(true); + ShopMenu menu = new ShopMenu(event.getPlayer()); + menu.open(); + } + + @EventHandler + public void onInteractWithBlock(PlayerInteractEvent e) { + Block block = e.getClickedBlock(); + if (block == null || block.getType() != Material.BARREL) return; + + Shop shop = ShopManager.getShopAt(block.getLocation()); + if (shop == null) return; + + if (shop.getOwnerUUID() == null) { + e.setCancelled(true); + return; + } + if (!shop.getOwnerUUID().equals(e.getPlayer().getUniqueId())) e.setCancelled(true); + } + + /** + * check if an item is valid + * + * @param item the item to check + * @return true if it's a valid item + */ + private boolean isValidItem(ItemStack item) { + return item != null && item.getType() != Material.AIR; + } + + @EventHandler + public void onFurnitureBreak(FurnitureBreakEvent event) { + CustomFurniture furniture = event.getFurniture(); + + if (furniture != null && furniture.getNamespacedID().equals("omc_company:caisse")) event.setCancelled(true); + } + + @EventHandler + public void onFurnitureInteract(FurnitureInteractEvent e) { + CustomFurniture furniture = e.getFurniture(); + + if (furniture == null) return; + + if (!furniture.getNamespacedID().equals("omc_company:caisse")) return; + + if (furniture.getEntity() == null) { + MessagesManager.sendMessage(e.getPlayer(), Component.text("§cErreur lors de l'ouverture du shop, veuillez contacter le staff. (Entity is null)"), Prefix.SHOP, MessageType.ERROR, true); + return; + } + + Shop shop = ShopManager.getShopAt(furniture.getEntity().getLocation().subtract(0, 1, 0).toBlockLocation()); + if (shop == null) { + MessagesManager.sendMessage(e.getPlayer(), Component.text("§cErreur lors de l'ouverture du shop, veuillez contacter le staff. (Shop is null)"), Prefix.SHOP, MessageType.ERROR, true); + return; + } + + e.setCancelled(true); + new ShopMenu(e.getPlayer()).open(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/manager/PlayerShopManager.java b/src/main/java/fr/openmc/core/features/corporation/manager/PlayerShopManager.java new file mode 100644 index 000000000..9f4c5807c --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/manager/PlayerShopManager.java @@ -0,0 +1,157 @@ +package fr.openmc.core.features.corporation.manager; + +import fr.openmc.api.hooks.ItemsAdderHook; +import fr.openmc.api.input.location.ItemInteraction; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.corporation.ShopFurniture; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; +import fr.openmc.core.utils.world.WorldUtils; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class PlayerShopManager { + + + /** + * Create a shop if the player has enough money and does not already have one + * + * @param player the player who creates it + */ + public static void startCreatingShop(Player player) { + if (!EconomyManager.withdrawBalance(player.getUniqueId(), 500)) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez d'argent pour créer un shop (500 " + EconomyManager.getEconomyIcon() + " requis)"), Prefix.SHOP, MessageType.ERROR, true); + return; + } + + ItemInteraction.runLocationInteraction( + player, + new ItemStack(Material.BARREL), + "shop:shop_creator", + 300, + "Vous avez reçu un tonneau pour poser votre shop", + "§cCréation de shop annulée", + location -> { + if (location == null) return false; + return createShop(player, location); + }, + () -> { + EconomyManager.addBalance(player.getUniqueId(), 500, "Annulation création shop"); + MessagesManager.sendMessage(player, Component.text("§cVous avez été remboursé de 500 " + EconomyManager.getEconomyIcon() + " §cpour l'annulation de la création de votre shop"), Prefix.SHOP, MessageType.INFO, true); + } + ); + } + + private static boolean createShop(Player player, Location location) { + Shop shop = new Shop(player.getUniqueId(), location.setRotation(0, 0)); + + Block barrel = location.getBlock(); + Block cashBlock = location.add(0, 1, 0).getBlock(); + + if (barrel.getType() != Material.AIR) { + MessagesManager.sendMessage(player, Component.text("§cImpossible de créer le shop ici, l'espace du tonneau doit être libre"), Prefix.SHOP, MessageType.ERROR, true); + return false; + } + + if (cashBlock.getType() != Material.AIR) { + MessagesManager.sendMessage(player, Component.text("§cImpossible de créer le shop ici, l'espace au-dessus du tonneau doit être libre"), Prefix.SHOP, MessageType.ERROR, true); + return false; + } + + if (ShopManager.placeShop(player, shop)) { + barrel.setType(Material.BARREL); + BlockData barrelData = barrel.getBlockData(); + if (barrelData instanceof Directional directional) { + directional.setFacing(WorldUtils.getYaw(player).getOpposite().toBlockFace()); + barrel.setBlockData(barrelData); + } + + ShopManager.getPlayerShops().put(player.getUniqueId(), shop); + + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.saveShop(shop)) { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la création du shop (cannot save shop location) : §bappelez un admin"), Prefix.SHOP, MessageType.ERROR, false); + deleteShop(player, true); + } + }); + + MessagesManager.sendMessage(player, Component.text("§aVotre shop a été créé avec succès ! Vous pouvez maintenant y ajouter des articles"), Prefix.SHOP, MessageType.SUCCESS, true); + MessagesManager.sendMessage(player, Component.text("§c500" + EconomyManager.getEconomyIcon() + " retirés de votre compte personnel"), Prefix.SHOP, MessageType.SUCCESS, false); + return true; + } else { + if (ItemsAdderHook.isHasItemAdder()) + if (ShopFurniture.removeShopFurniture(cashBlock)) { + cashBlock.setType(Material.AIR); + barrel.setType(Material.AIR); + } else { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la création du shop (cannot remove shop furniture) : §bappelez un admin"), Prefix.SHOP, MessageType.ERROR, false); + } + return false; + } + } + + /** + * Delete a shop if it is empty + * + * @param player The player who deletes the shop + */ + public static void deleteShop(Player player, boolean fromError) { + Shop shop = ShopManager.getPlayerShop(player.getUniqueId()); + if (!fromError && !shop.getItems().isEmpty()) { + MessagesManager.sendMessage(player, Component.text("§cVotre shop n'est pas vide"), Prefix.SHOP, MessageType.WARNING, false); + return; + } + + if (!ShopManager.removeShop(shop)) { + MessagesManager.sendMessage(player, Component.text("§cShop introuvable (faites un screen de votre shop actuellement et appelez un admin)"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + ShopManager.getPlayerShops().remove(player.getUniqueId()); + + if (!fromError) { + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.deleteShop(shop)) { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la suppression du shop (appelez un admin)"), Prefix.SHOP, MessageType.ERROR, false); + } + }); + + MessagesManager.sendMessage(player, Component.text("§6Votre shop a bien été supprimé !"), Prefix.SHOP, MessageType.SUCCESS, false); + } + + EconomyManager.addBalance(player.getUniqueId(), 400); + MessagesManager.sendMessage(player, Component.text("§a400" + EconomyManager.getEconomyIcon() + " remboursés sur votre compte personnel"), Prefix.SHOP, MessageType.SUCCESS, true); + } + + public static void adminDeleteShop(OfflinePlayer player, Player admin) { + Shop shop = ShopManager.getPlayerShop(player.getUniqueId()); + if (shop == null) return; + + if (!ShopManager.removeShop(shop)) { + MessagesManager.sendMessage(admin, Component.text("§cShop introuvable"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + ShopManager.getPlayerShops().remove(player.getUniqueId()); + + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.deleteShop(shop)) { + MessagesManager.sendMessage(admin, Component.text("§cErreur lors de la suppression du shop"), Prefix.SHOP, MessageType.ERROR, false); + } + }); + + MessagesManager.sendMessage(admin, Component.text("§6Le shop a bien été supprimé !"), Prefix.SHOP, MessageType.SUCCESS, false); + EconomyManager.addBalance(player.getUniqueId(), 400); + MessagesManager.sendMessage(player, Component.text("§a400" + EconomyManager.getEconomyIcon() + " remboursés sur votre compte personnel"), Prefix.SHOP, MessageType.SUCCESS, true); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/manager/ShopDatabaseManager.java b/src/main/java/fr/openmc/core/features/corporation/manager/ShopDatabaseManager.java new file mode 100644 index 000000000..17e2cef8d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/manager/ShopDatabaseManager.java @@ -0,0 +1,75 @@ +package fr.openmc.core.features.corporation.manager; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.corporation.models.Shop; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.jetbrains.annotations.Nullable; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ShopDatabaseManager { + + private static Dao shopDao; + + public static void initDB(ConnectionSource connectionSource) throws SQLException { + try { + TableUtils.createTableIfNotExists(connectionSource, Shop.class); + shopDao = DaoManager.createDao(connectionSource, Shop.class); + } catch (SQLException e) { + throw new SQLException(e); + } + } + + public static @Nullable Map loadShops() { + Map shopsByLocation = new HashMap<>(); + try { + List shops = shopDao.queryForAll(); + for (Shop shop : shops) { + Location loc = new Location(Bukkit.getWorld("world"), shop.getX(), shop.getY(), shop.getZ()); + shopsByLocation.put(loc, shop); + } + } catch (SQLException e) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to load shops from database", e); + return null; + } + return shopsByLocation; + } + + public static @Nullable Shop loadShopFor(UUID ownerUUID) { + try { + return shopDao.queryForId(ownerUUID); + } catch (SQLException e) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to load shop for owner UUID: {}", ownerUUID, e); + return null; + } + } + + public static boolean saveShop(Shop shop) { + try { + shopDao.createOrUpdate(shop); + return true; + } catch (SQLException e) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to save shop for owner UUID: {}", shop.getOwnerUUID(), e); + return false; + } + } + + public static boolean deleteShop(Shop shop) { + try { + shopDao.delete(shop); + return true; + } catch (SQLException e) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to delete shop for owner UUID: {}", shop.getOwnerUUID(), e); + return false; + } + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/manager/ShopManager.java b/src/main/java/fr/openmc/core/features/corporation/manager/ShopManager.java new file mode 100644 index 000000000..f65db5b69 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/manager/ShopManager.java @@ -0,0 +1,187 @@ +package fr.openmc.core.features.corporation.manager; + +import fr.openmc.api.hooks.ItemsAdderHook; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.corporation.ShopFurniture; +import fr.openmc.core.features.corporation.models.Shop; +import fr.openmc.core.utils.world.WorldUtils; +import lombok.Getter; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +public class ShopManager { + + @Getter + private static final Map playerShops = new HashMap<>(); + private static Map shopsByLocation; + + public static void init() { + loadShops(); + } + + public static void shutdown() { + saveShops(); + } + + public static boolean loadShops() { + if (shopsByLocation != null) shopsByLocation.clear(); + OMCPlugin.getInstance().getSLF4JLogger().info("Loading shops from database..."); + shopsByLocation = ShopDatabaseManager.loadShops(); + if (shopsByLocation == null) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to initialize ShopManager due to database load failure. No shops loaded."); + shopsByLocation = new HashMap<>(); + return false; + } + shopsByLocation.values().forEach(shop -> setPlayerShop(shop.getOwnerUUID(), shop)); + OMCPlugin.getInstance().getSLF4JLogger().info("Loaded {} shops from database.", shopsByLocation.size()); + return true; + } + + public static boolean loadShopFor(OfflinePlayer player) { + OMCPlugin.getInstance().getSLF4JLogger().info("Loading shop for player {} from database...", player.getName()); + Shop shop = ShopDatabaseManager.loadShopFor(player.getUniqueId()); + if (shop == null) { + OMCPlugin.getInstance().getSLF4JLogger().info("No shop found for player {}.", player.getName()); + return false; + } + Location loc = new Location(Bukkit.getWorld("world"), shop.getX(), shop.getY(), shop.getZ()); + shopsByLocation.put(loc, shop); + setPlayerShop(player.getUniqueId(), shop); + OMCPlugin.getInstance().getSLF4JLogger().info("Loaded shop for player {}.", player.getName()); + return true; + } + + public static boolean saveShops() { + OMCPlugin.getInstance().getSLF4JLogger().info("Saving all shops to database..."); + for (Shop shop : playerShops.values()) { + if (!ShopDatabaseManager.saveShop(shop)) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to save all shops to database."); + return false; + } + } + OMCPlugin.getInstance().getSLF4JLogger().info("All shops saved to database successfully. {} shops saved.", playerShops.size()); + return true; + } + + public static boolean saveShopFor(OfflinePlayer player) { + OMCPlugin.getInstance().getSLF4JLogger().info("Saving shop for player {} to database...", player.getName()); + Shop shop = getPlayerShop(player.getUniqueId()); + if (shop == null) { + OMCPlugin.getInstance().getSLF4JLogger().info("No shop found for player {} to save.", player.getName()); + return false; + } + if (!ShopDatabaseManager.saveShop(shop)) { + OMCPlugin.getInstance().getSLF4JLogger().error("Failed to save shop for player {} to database.", player.getName()); + return false; + } + OMCPlugin.getInstance().getSLF4JLogger().info("Shop for player {} saved to database successfully.", player.getName()); + return true; + } + + /** + * Retrieves a shop located at a given location. + * + * @param location The location to check. + * @return The shop found at that location, or null if none exists. + */ + public static Shop getShopAt(Location location) { + return shopsByLocation.get(location.setRotation(0, 0)); + } + + /** + * Retrieves a shop located at a given location. + * + * @param x The x-coordinate of the location. + * @param y The y-coordinate of the location. + * @param z The z-coordinate of the location. + * @return The shop found at that location, or null if none exists. + */ + public static Shop getShopAt(int x, int y, int z) { + return shopsByLocation.get(new Location(Bukkit.getWorld("world"), x, y, z)); + } + + /** + * Places the shop block (sign or ItemsAdder furniture) in the world, + * oriented based on the player's direction. + * + * @param player The player placing the shop. + * @param shop The shop to place. + * @return true if successfully placed, false otherwise. + */ + public static boolean placeShop(Player player, Shop shop) { + Shop.Multiblock multiblock = shop.getMultiblock(); + if (multiblock == null) return false; + + Block cashBlock = multiblock.cashBlock().getBlock(); + + shopsByLocation.put(shop.getLocation(), shop); + + if (ItemsAdderHook.isHasItemAdder()) + if (!ShopFurniture.placeShopFurniture(cashBlock, WorldUtils.getYaw(player))) cashBlock.setType(Material.OAK_SIGN); + else cashBlock.setType(Material.OAK_SIGN); + + return true; + } + + /** + * Removes a shop from the world and unregisters its multiblock structure. + * Handles both ItemsAdder and fallback vanilla types. + * + * @param shop The shop to remove. + * @return true if successfully removed, false otherwise. + */ + public static boolean removeShop(Shop shop) { + Shop.Multiblock multiblock = shop.getMultiblock(); + if (multiblock == null) return false; + + World world = Bukkit.getWorld("world"); + if (world == null) { + OMCPlugin.getInstance().getSLF4JLogger().error("World 'world' not found while removing shop at location: {}", shop.getLocation()); + return false; + } + + Block cashBlock = world.getBlockAt(multiblock.cashBlock()); + Block stockBlock = world.getBlockAt(multiblock.stockBlock()); + + if (ItemsAdderHook.isHasItemAdder()) { + if (!ShopFurniture.hasFurniture(cashBlock)) return false; + if (!ShopFurniture.removeShopFurniture(cashBlock)) return false; + } + else if ((cashBlock.getType() != Material.OAK_SIGN && cashBlock.getType() != Material.BARRIER) || stockBlock.getType() != Material.BARREL) return false; + cashBlock.setType(Material.AIR); // Remove sign or furniture block + stockBlock.setType(Material.AIR); // Remove barrel block + + // Async cleanup of location mappings + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> + shopsByLocation.entrySet().removeIf(entry -> entry.getValue().getOwnerUUID().equals(shop.getOwnerUUID()))); + return true; + } + + public static Set getAllShops() { + return Set.copyOf(shopsByLocation.values()); + } + + public static Shop getPlayerShop(UUID playerUUID) { + return playerShops.get(playerUUID); + } + + public static void setPlayerShop(UUID playerUUID, Shop shop) { + playerShops.put(playerUUID, shop); + } + + /** + * Check if a player has a shop + * + * @param playerUUID the UUID of the player to check + * @return true if a shop is found + */ + public static boolean hasShop(UUID playerUUID) { + return getPlayerShop(playerUUID) != null; + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/menu/ShopCatalogueMenu.java b/src/main/java/fr/openmc/core/features/corporation/menu/ShopCatalogueMenu.java new file mode 100644 index 000000000..d3d65f269 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/menu/ShopCatalogueMenu.java @@ -0,0 +1,80 @@ +package fr.openmc.core.features.corporation.menu; + +import dev.lone.itemsadder.api.FontImages.FontImageWrapper; +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ShopCatalogueMenu extends PaginatedMenu { + + public ShopCatalogueMenu(Player owner) { + super(owner); + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGEST; + } + + @Override + public int getSizeOfItems() { + return getItems().size(); + } + + @Override + public @Nullable Material getBorderMaterial() { + return null; + } + + @Override + public @NotNull List getStaticSlots() { + return StaticSlots.getStandardSlots(getInventorySize()); + } + + @Override + public List getItems() { + return new ArrayList<>(); + } + + @Override + public Map getButtons() { + return Map.of(); + } + + @Override + public @NotNull String getName() { + return "Menu du shop "; + } + + @Override + public String getTexture() { + return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); + } + + @Override + public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public List getTakableSlot() { + return List.of(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/menu/ShopMenu.java b/src/main/java/fr/openmc/core/features/corporation/menu/ShopMenu.java new file mode 100644 index 000000000..c9c7b3a6a --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/menu/ShopMenu.java @@ -0,0 +1,59 @@ +package fr.openmc.core.features.corporation.menu; + +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ShopMenu extends Menu { + + private int amountToBuy = 1; + + public ShopMenu(Player owner) { + super(owner); + } + + @Override + public @NotNull String getName() { + return "Menu du shop "; + } + + @Override + public String getTexture() { + return ""; + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGER; + } + + @Override + public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public @NotNull Map getContent() { + Map content = new HashMap<>(); + + return content; + } + + @Override + public List getTakableSlot() { + return List.of(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/menu/ShopSalesMenu.java b/src/main/java/fr/openmc/core/features/corporation/menu/ShopSalesMenu.java new file mode 100644 index 000000000..760e956cb --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/menu/ShopSalesMenu.java @@ -0,0 +1,84 @@ +package fr.openmc.core.features.corporation.menu; + +import dev.lone.itemsadder.api.FontImages.FontImageWrapper; +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ShopSalesMenu extends PaginatedMenu { + + public ShopSalesMenu(Player owner) { + super(owner); + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGEST; + } + + @Override + public int getSizeOfItems() { + return getItems().size(); + } + + @Override + public @Nullable Material getBorderMaterial() { + return null; + } + + @Override + public @NotNull List getStaticSlots() { + return StaticSlots.getStandardSlots(getInventorySize()); + } + + @Override + public List getItems() { + List items = new java.util.ArrayList<>(); + + return items; + } + + @Override + public Map getButtons() { + Map buttons = new HashMap<>(); + + return buttons; + } + + @Override + public @NotNull String getName() { + return "Ventes de "; + } + + @Override + public String getTexture() { + return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public List getTakableSlot() { + return List.of(); + } + + @Override + public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { + + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/menu/ShopSearchMenu.java b/src/main/java/fr/openmc/core/features/corporation/menu/ShopSearchMenu.java new file mode 100644 index 000000000..0f2244506 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/menu/ShopSearchMenu.java @@ -0,0 +1,79 @@ +package fr.openmc.core.features.corporation.menu; + +import dev.lone.itemsadder.api.FontImages.FontImageWrapper; +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +public class ShopSearchMenu extends PaginatedMenu { + + public ShopSearchMenu(Player owner) { + super(owner); + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGEST; + } + + @Override + public int getSizeOfItems() { + return getItems().size(); + } + + @Override + public @Nullable Material getBorderMaterial() { + return null; + } + + @Override + public @NotNull List getStaticSlots() { + return StaticSlots.getStandardSlots(getInventorySize()); + } + + @Override + public List getItems() { + return List.of(); + } + + @Override + public Map getButtons() { + return Map.of(); + } + + @Override + public @NotNull String getName() { + return "§l§6Menu de Recherche de Shop"; + } + + @Override + public String getTexture() { + return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); + } + + @Override + public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public List getTakableSlot() { + return List.of(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/menu/ShopStocksMenu.java b/src/main/java/fr/openmc/core/features/corporation/menu/ShopStocksMenu.java new file mode 100644 index 000000000..30fdcceb1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/menu/ShopStocksMenu.java @@ -0,0 +1,84 @@ +package fr.openmc.core.features.corporation.menu; + +import dev.lone.itemsadder.api.FontImages.FontImageWrapper; +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ShopStocksMenu extends PaginatedMenu { + + public ShopStocksMenu(Player owner) { + super(owner); + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGEST; + } + + @Override + public int getSizeOfItems() { + return getItems().size(); + } + + @Override + public @Nullable Material getBorderMaterial() { + return null; + } + + @Override + public @NotNull List getStaticSlots() { + return StaticSlots.getStandardSlots(getInventorySize()); + } + + @Override + public List getItems() { + List items = new java.util.ArrayList<>(); + + return items; + } + + @Override + public Map getButtons() { + Map buttons = new HashMap<>(); + + return buttons; + } + + @Override + public @NotNull String getName() { + return "Menu des Stocks de "; + } + + @Override + public String getTexture() { + return FontImageWrapper.replaceFontImages("§r§f:offset_-11::large_shop_menu:"); + } + + @Override + public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public List getTakableSlot() { + return List.of(); + } +} diff --git a/src/main/java/fr/openmc/core/features/corporation/models/Shop.java b/src/main/java/fr/openmc/core/features/corporation/models/Shop.java new file mode 100644 index 000000000..6c7f5448a --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/models/Shop.java @@ -0,0 +1,205 @@ +package fr.openmc.core.features.corporation.models; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.core.features.corporation.MethodState; +import fr.openmc.core.features.corporation.manager.ShopManager; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.utils.ItemUtils; +import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Barrel; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Getter +@DatabaseTable(tableName = "shops") +public class Shop { + + @DatabaseField(id = true, columnName = "owner_uuid", canBeNull = false) + private UUID ownerUUID; + @DatabaseField(canBeNull = false) + private int x; + @DatabaseField(canBeNull = false) + private int y; + @DatabaseField(canBeNull = false) + private int z; + + private final List items = new ArrayList<>(); + private final List sales = new ArrayList<>(); + + private Location location; + private Multiblock multiblock; + + private double turnover = 0; + + Shop() { + // required for ORMLite + } + + public Shop(UUID ownerUUID, int x, int y, int z) { + this(ownerUUID, new Location(Bukkit.getWorld("world"), x, y, z)); + } + + public Shop(UUID ownerUUID, Location location) { + this.ownerUUID = ownerUUID; + this.x = location.getBlockX(); + this.y = location.getBlockY(); + this.z = location.getBlockZ(); + this.location = location.toBlockLocation(); + this.multiblock = new Multiblock(this.location, this.location.clone().add(0, 1, 0)); + } + + /** + * requirement : item need the uuid of the player who restock the shop + + * quand un item est vendu un partie du profit reviens a celui qui a approvisionner + */ + public void checkStock() { + Multiblock multiblock = getMultiblock(); + + if (multiblock == null) return; + + Block stockBlock = multiblock.stockBlock().getBlock(); + if (stockBlock.getType() != Material.BARREL) { + ShopManager.removeShop(this); + return; + } + + if (stockBlock.getState(false) instanceof Barrel barrel) { + + Inventory inventory = barrel.getInventory(); + for (ItemStack item : inventory.getContents()) { + if (item == null || item.getType() == Material.AIR) continue; + + ItemMeta itemMeta = item.getItemMeta(); + if (itemMeta == null) continue; + } + } + } + + public String getName() { + return CacheOfflinePlayer.getOfflinePlayer(ownerUUID).getName() + "'s Shop"; + } + + /** + * know if the uuid is the shop owner + * + * @param uuid the uuid we check + */ + public boolean isOwner(UUID uuid) { + return ownerUUID.equals(uuid); + } + + public void addItem(ShopItem item){ + items.add(item); + } + + public void addSales(ShopItem item){ + sales.add(item); + } + + /** + * get an item from the shop + * + * @param index index of the item + */ + public ShopItem getItem(int index) { + return items.get(index); + } + + /** + * add an item to the shop + * + * @param itemStack the item + * @param price the price + * @param amount the amount of it + */ + public boolean addItem(ItemStack itemStack, double price, int amount, UUID itemID) { + ShopItem item = itemID == null ? new ShopItem(itemStack, price) : new ShopItem(itemStack, price, itemID); + for (ShopItem shopItem : items) if (shopItem.getItem().isSimilar(itemStack)) return true; + + if (amount > 1) item.setAmount(amount); + + items.add(item); + return false; + } + + /** + * buy an item in the shop + * + * @param item the item to buy + * @param amountToBuy the amount of it + * @param buyer the player who buy + * @return a MethodState + */ + public MethodState buy(ShopItem item, int amountToBuy, Player buyer) { + if (! ItemUtils.hasAvailableSlot(buyer)) return MethodState.SPECIAL; + if (amountToBuy > item.getAmount()) return MethodState.WARNING; + if (isOwner(buyer.getUniqueId())) return MethodState.FAILURE; + + if (!EconomyManager.withdrawBalance(buyer.getUniqueId(), item.getPrice(amountToBuy))) return MethodState.ERROR; + double basePrice = item.getPrice(amountToBuy); + turnover += item.getPrice(amountToBuy); + + EconomyManager.addBalance(ownerUUID, item.getPrice(amountToBuy)); + Player player = Bukkit.getPlayer(ownerUUID); + if (player != null) { + MessagesManager.sendMessage(player, Component.text(buyer.getName() + " a acheté " + amountToBuy + " " + item.getItem().getType() + " pour " + item.getPrice(amountToBuy) + EconomyManager.getEconomyIcon() + ", l'argent vous a été transféré !"), Prefix.SHOP, MessageType.SUCCESS, false); + } + + ItemStack toGive = item.getItem().clone(); + toGive.setAmount(amountToBuy); + + List stacks = ItemUtils.splitAmountIntoStack(toGive); + for (ItemStack stack : stacks) buyer.getInventory().addItem(stack); + + sales.add(item.copy().setAmount(amountToBuy)); + item.setAmount(item.getAmount() - amountToBuy); + + return MethodState.SUCCESS; + } + + /** + * get the shop Icon + * + * @param menu the menu + * @param fromShopMenu know if it from shopMenu + */ + public ItemBuilder getIcon(Menu menu, boolean fromShopMenu) { + return new ItemBuilder(menu, fromShopMenu ? Material.GOLD_INGOT : Material.BARREL, itemMeta -> { + itemMeta.displayName(Component.text("§e§l" + (fromShopMenu ? "Informations" : getName()))); + + List lore = new ArrayList<>(List.of( + Component.text("§7■ Chiffre d'affaires : " + EconomyManager.getFormattedNumber(turnover)), + Component.text("§7■ Ventes : §f" + sales.size()) + )); + if (! fromShopMenu) lore.add(Component.text("§7■ Cliquez pour accéder au shop")); + itemMeta.lore(lore); + }); + } + + public int getAllItemsAmount() { + int amount = 0; + for (ShopItem item : items) amount += item.getAmount(); + return amount; + } + + public record Multiblock(Location stockBlock, Location cashBlock) {} +} diff --git a/src/main/java/fr/openmc/core/features/corporation/models/ShopItem.java b/src/main/java/fr/openmc/core/features/corporation/models/ShopItem.java new file mode 100644 index 000000000..1644ca60d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/corporation/models/ShopItem.java @@ -0,0 +1,110 @@ +package fr.openmc.core.features.corporation.models; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import fr.openmc.core.utils.ItemUtils; +import lombok.Getter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.UUID; + +import static com.j256.ormlite.field.DataType.BYTE_ARRAY; + +@Getter +@DatabaseTable(tableName = "shop_items") +public class ShopItem { + + @DatabaseField(id = true, columnName = "owner_uuid", canBeNull = false) + private UUID ownerUUID; + @DatabaseField(canBeNull = false, columnName = "item_uuid") + private UUID itemUUID; + @DatabaseField(canBeNull = false) + private double pricePerItem; + @DatabaseField(canBeNull = false) + private int amount; + @DatabaseField(canBeNull = false, dataType = BYTE_ARRAY) + private byte[] itemBytes; + + private double price; + private ItemStack item; + + ShopItem() { + // required for ORMLite + } + + public ShopItem(ItemStack item, double pricePerItem) { + this(item, pricePerItem, UUID.randomUUID()); + } + + public ShopItem(ItemStack item, double pricePerItem, UUID itemID) { + this.item = item.clone(); + this.pricePerItem = pricePerItem; + this.item.setAmount(1); + this.price = pricePerItem * amount; + this.amount = 0; + this.itemUUID = itemID; + } + + public ShopItem(byte[] itemBytes, UUID ownerUUID, double price, int amount, UUID itemUUID) { + this.itemBytes = itemBytes; + this.ownerUUID = ownerUUID; + this.price = price; + this.amount = amount; + this.itemUUID = itemUUID; + } + + /** + * get the name of an item + * + * @param amount the new amount of the item + * @return default the ShopItem + */ + public ShopItem setAmount(int amount) { + this.amount = amount; + this.price = pricePerItem * amount; + return this; + } + + /** + * Get the name of an item, either custom or default + * + * @param itemStack the item to get the name from + * @return the name of the item + */ + public static Component getItemName(ItemStack itemStack) { + if (itemStack.hasItemMeta()) { + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta.hasDisplayName()) return itemMeta.displayName(); + } + // If no custom name, return default name + return ItemUtils.getItemTranslation(itemStack).color(NamedTextColor.GRAY).decorate(TextDecoration.BOLD); + } + + /** + * Create a copy of the ShopItem + * + * @return the copied ShopItem + */ + public ShopItem copy() { + return new ShopItem(item.clone(), pricePerItem); + } + + /** + * Get the price of an item based on the amount + * + * @param amount the amount of the item + * @return the total price + */ + public double getPrice(int amount) { + return pricePerItem * amount; + } + + public ShopItem deserialize() { + ItemStack item = ItemStack.deserializeBytes(itemBytes); + return new ShopItem(item, price, itemUUID).setAmount(amount); + } +} diff --git a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopSale.java.bak b/src/main/java/fr/openmc/core/features/corporation/models/ShopSale.java similarity index 64% rename from src/main/java/fr/openmc/core/disabled/corporation/models/DBShopSale.java.bak rename to src/main/java/fr/openmc/core/features/corporation/models/ShopSale.java index 169c9b495..496bbb250 100644 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopSale.java.bak +++ b/src/main/java/fr/openmc/core/features/corporation/models/ShopSale.java @@ -1,45 +1,42 @@ -package fr.openmc.core.disabled.corporation.models; - -import java.util.UUID; - -import org.bukkit.inventory.ItemStack; +package fr.openmc.core.features.corporation.models; import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; - -import fr.openmc.core.disabled.corporation.shops.ShopItem; import lombok.Getter; +import org.bukkit.inventory.ItemStack; + +import java.util.UUID; @Getter @DatabaseTable(tableName = "shop_sales") -public class DBShopSale { +public class ShopSale { + @DatabaseField(canBeNull = false, id = true, columnName = "owner_uuid") + private UUID ownerUUID; @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY) private byte[] items; - @DatabaseField(canBeNull = false) - private UUID shop; @DatabaseField(canBeNull = false, columnName = "sale_uuid") - private UUID saleUuid; + private UUID saleUUID; @DatabaseField(canBeNull = false) private double price; @DatabaseField(canBeNull = false) private int amount; - DBShopSale() { + ShopSale() { // required for ORMLite } - - public DBShopSale(byte[] items, UUID shop, double price, int amount, UUID saleUuid) { + + public ShopSale(byte[] items, UUID ownerUUID, double price, int amount, UUID saleUUID) { this.items = items; - this.shop = shop; + this.ownerUUID = ownerUUID; this.price = price; this.amount = amount; - this.saleUuid = saleUuid; + this.saleUUID = saleUUID; } public ShopItem deserialize() { ItemStack item = ItemStack.deserializeBytes(items); - ShopItem shopItem = new ShopItem(item, price, saleUuid); + ShopItem shopItem = new ShopItem(item, price, saleUUID); shopItem.setAmount(amount); return shopItem; } diff --git a/src/main/java/fr/openmc/core/features/economy/EconomyManager.java b/src/main/java/fr/openmc/core/features/economy/EconomyManager.java index 1c2ee977e..c907f7a7a 100644 --- a/src/main/java/fr/openmc/core/features/economy/EconomyManager.java +++ b/src/main/java/fr/openmc/core/features/economy/EconomyManager.java @@ -13,6 +13,7 @@ import fr.openmc.core.features.economy.commands.Pay; import fr.openmc.core.features.economy.models.EconomyPlayer; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import java.math.BigDecimal; import java.sql.SQLException; @@ -231,4 +232,9 @@ public static String getEconomyIcon() { return "Ⓐ"; } } + + public static boolean hasEnoughMoney(@NotNull UUID uniqueId, int requiredAmount) { + double balance = EconomyManager.getBalance(uniqueId); + return balance >= requiredAmount; + } } diff --git a/src/main/java/fr/openmc/core/features/economy/models/Bank.java b/src/main/java/fr/openmc/core/features/economy/models/Bank.java index 37b2ce80f..ade3af214 100644 --- a/src/main/java/fr/openmc/core/features/economy/models/Bank.java +++ b/src/main/java/fr/openmc/core/features/economy/models/Bank.java @@ -1,12 +1,11 @@ package fr.openmc.core.features.economy.models; -import java.util.UUID; - import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; - import lombok.Getter; +import java.util.UUID; + @Getter @DatabaseTable(tableName = "banks") public class Bank { diff --git a/src/main/java/fr/openmc/core/features/economy/models/EconomyPlayer.java b/src/main/java/fr/openmc/core/features/economy/models/EconomyPlayer.java index e523b9166..9c92ee4fc 100644 --- a/src/main/java/fr/openmc/core/features/economy/models/EconomyPlayer.java +++ b/src/main/java/fr/openmc/core/features/economy/models/EconomyPlayer.java @@ -1,12 +1,11 @@ package fr.openmc.core.features.economy.models; -import java.util.UUID; - import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; - import lombok.Getter; +import java.util.UUID; + @Getter @DatabaseTable(tableName = "balances") public class EconomyPlayer { diff --git a/src/main/java/fr/openmc/core/features/homes/models/HomeLimit.java b/src/main/java/fr/openmc/core/features/homes/models/HomeLimit.java index 58cd8f62d..c103d337b 100644 --- a/src/main/java/fr/openmc/core/features/homes/models/HomeLimit.java +++ b/src/main/java/fr/openmc/core/features/homes/models/HomeLimit.java @@ -1,14 +1,13 @@ package fr.openmc.core.features.homes.models; -import java.util.UUID; - import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; - import fr.openmc.core.features.homes.HomeLimits; import lombok.Getter; import lombok.Setter; +import java.util.UUID; + @Getter @DatabaseTable(tableName = "home_limits") public class HomeLimit { diff --git a/src/main/java/fr/openmc/core/items/CustomItem.java b/src/main/java/fr/openmc/core/items/CustomItem.java index 49309a6b6..3b6c580ac 100644 --- a/src/main/java/fr/openmc/core/items/CustomItem.java +++ b/src/main/java/fr/openmc/core/items/CustomItem.java @@ -4,9 +4,10 @@ import fr.openmc.api.hooks.ItemsAdderHook; import lombok.Getter; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public abstract class CustomItem { - public abstract ItemStack getVanilla(); + public abstract @NotNull ItemStack getVanilla(); @Getter private final String name; public CustomItem(String name) { @@ -44,7 +45,7 @@ public boolean equals(Object object) { * 2. Vanilla * @return Best ItemStack to use for the server */ - public ItemStack getBest() { + public @NotNull ItemStack getBest() { return !ItemsAdderHook.isHasItemAdder() || getItemsAdder() == null ? getVanilla() : getItemsAdder(); } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/items/CustomItemRegistry.java b/src/main/java/fr/openmc/core/items/CustomItemRegistry.java index 781585af2..bad13aa79 100644 --- a/src/main/java/fr/openmc/core/items/CustomItemRegistry.java +++ b/src/main/java/fr/openmc/core/items/CustomItemRegistry.java @@ -9,6 +9,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.HashMap; @@ -97,7 +98,7 @@ public static void registerItem(CustomItem item) { public static void registerSimpleItem(String name, ItemStack item) { register(name, new CustomItem(name) { @Override - public ItemStack getVanilla() { + public @NotNull ItemStack getVanilla() { return item; } }); @@ -110,7 +111,7 @@ public static void registerSimpleItem(String name, Material item) { public static void registerSimpleItem(String name, Material material, String displayName) { registerItem(new CustomItem(name) { @Override - public ItemStack getVanilla() { + public @NotNull ItemStack getVanilla() { ItemStack item = new ItemStack(material); ItemMeta meta = item.getItemMeta(); meta.displayName(Component.text(displayName).decoration(TextDecoration.ITALIC, false)); diff --git a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java index 4fdacadc6..4ea46245c 100644 --- a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java @@ -13,6 +13,7 @@ import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.corporation.manager.ShopDatabaseManager; import fr.openmc.core.features.dream.DreamManager; import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; @@ -72,6 +73,7 @@ public static void init() { MascotsManager.initDB(connectionSource); PlayerSettingsManager.initDB(connectionSource); CityStatisticsManager.initDB(connectionSource); + ShopDatabaseManager.initDB(connectionSource); HalloweenManager.initDB(connectionSource); } catch (SQLException e) { OMCPlugin.getInstance().getSLF4JLogger().error("Failed to initialize the database connection.", e); diff --git a/src/main/java/fr/openmc/core/utils/world/WorldUtils.java b/src/main/java/fr/openmc/core/utils/world/WorldUtils.java index b280318d1..a804bdb8b 100644 --- a/src/main/java/fr/openmc/core/utils/world/WorldUtils.java +++ b/src/main/java/fr/openmc/core/utils/world/WorldUtils.java @@ -6,16 +6,17 @@ public class WorldUtils { public static Yaw getYaw(Player p) { float yaw = p.getLocation().getYaw(); - yaw = (yaw % 360 + 360) % 360; // true modulo, as javas modulo is unique for negative values - if (yaw > 135 || yaw < -135) { + if (yaw < 0) yaw += 360; + if (yaw > 135 && yaw <= 225) { return Yaw.NORTH; - } else if (yaw < -45) { + } else if (yaw > 225 && yaw <= 315) { return Yaw.EAST; - } else if (yaw > 45) { + } else if (yaw > 45 && yaw <= 135) { return Yaw.WEST; - } else { + } else if (yaw > 315 || yaw <= 45) { return Yaw.SOUTH; + } else { + return Yaw.NORTH; // should never happen } } - } diff --git a/src/main/java/fr/openmc/core/utils/world/Yaw.java b/src/main/java/fr/openmc/core/utils/world/Yaw.java index 82b3ba4ed..368875ac4 100644 --- a/src/main/java/fr/openmc/core/utils/world/Yaw.java +++ b/src/main/java/fr/openmc/core/utils/world/Yaw.java @@ -1,13 +1,14 @@ package fr.openmc.core.utils.world; +import lombok.Getter; import org.bukkit.block.BlockFace; public enum Yaw { - NORTH, - EAST, - SOUTH, - WEST; + NORTH(180), + EAST(270), + SOUTH(0), + WEST(90); public Yaw getOpposite() { return switch (this) { @@ -26,5 +27,11 @@ public BlockFace toBlockFace() { case WEST -> BlockFace.WEST; }; } - + + @Getter + final float playerYaw; + + Yaw (float playerYaw) { + this.playerYaw = playerYaw; + } }