diff --git a/build.gradle b/build.gradle index 03a06c88f..fe25c580d 100644 --- a/build.gradle +++ b/build.gradle @@ -85,7 +85,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 { @@ -131,4 +131,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 2e386dc46..5dbed38e0 100644 --- a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java +++ b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java @@ -171,12 +171,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/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 3f3436730..9145e4fe7 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -44,6 +44,7 @@ import fr.openmc.core.features.quests.QuestProgressSaveManager; import fr.openmc.core.features.quests.QuestsManager; import fr.openmc.core.features.settings.PlayerSettingsManager; +import fr.openmc.core.features.shops.manager.ShopManager; import fr.openmc.core.features.tickets.TicketManager; import fr.openmc.core.features.tpa.TPAManager; import fr.openmc.core.features.updates.UpdateManager; @@ -115,7 +116,8 @@ public class OMCPlugin extends JavaPlugin { new LeaderboardManager(), new MainMenu(), new HologramLoader(), - new HomeIconCacheManager() + new HomeIconCacheManager(), + new ShopManager() )); // ** Registry of OMC Plugin Hooks @@ -180,7 +182,7 @@ public void onEnable() { .filter(f -> !(f instanceof LoadAfterItemsAdder)) .forEachOrdered(Feature::startInit); - // * Si ItemsAdder est pas présent, alors on charge les dernieres features maintenant + // * Si ItemsAdder n'est pas présent, alors on charge les dernières features maintenant if (!ItemsAdderHook.isEnable()) { loadAfterItemsAdder(); } diff --git a/src/main/java/fr/openmc/core/bootstrap/features/Feature.java b/src/main/java/fr/openmc/core/bootstrap/features/Feature.java index 0e24bb0cc..7ad104e4a 100644 --- a/src/main/java/fr/openmc/core/bootstrap/features/Feature.java +++ b/src/main/java/fr/openmc/core/bootstrap/features/Feature.java @@ -20,7 +20,7 @@ public abstract class Feature { * Lance l'initialisation avec des règles en fonction des interfaces mises (NotUnitTest, LoadIfEnable) */ public final void startInit() { - // Condition d'initialisation (si feature ne doit pas etre lancé dans les tests ou que elle nécéssite un hook) + // Condition d'initialisation (si feature ne doit pas être lancée dans les tests ou qu'elle nécessite un hook) if (this instanceof NotInUnitTest && OMCPlugin.isUnitTestVersion()) { OMCLogger.errorFormatted("Feature " + this.getClass().getSimpleName() + " non initialisée dans les Unit Tests"); return; @@ -49,7 +49,7 @@ public final void startInit() { OMCPlugin.registerEvents(listener); } } - // Enregistre les commands + // Enregistre les commandes if (this instanceof HasCommands hasCommands) { for (Object command : hasCommands.getCommands()) { CommandsManager.getHandler().register(command); @@ -79,7 +79,7 @@ public final void startDB(ConnectionSource connectionSource) throws SQLException } /** - * Sauvegarde la feature si elle a ete initialisee. + * Sauvegarde la feature si elle a ete initialisée. */ public final void startSave() { if (!initialize) return; @@ -88,9 +88,9 @@ public final void startSave() { } /** - * Indique si la feature a ete initialisee avec succes. + * Indique si la feature a ete initialisée avec succès. * - * @return True si l'initialisation a reussi + * @return True si l'initialisation a réussi */ public final boolean isInitialized() { return initialize; 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 3b5d7c474..67b065def 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.shops.MethodState; import fr.openmc.core.disabled.corporation.commands.CompanyCommand; -import fr.openmc.core.disabled.corporation.commands.ShopCommand; +import fr.openmc.core.features.shops.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.shops.data.MerchantData; +import fr.openmc.core.features.shops.listener.ShopListener; import fr.openmc.core.disabled.corporation.models.*; +import fr.openmc.core.features.shops.manager.PlayerShopManager; +import fr.openmc.core.features.shops.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/MethodState.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/MethodState.java.bak deleted file mode 100644 index daecc69cf..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/MethodState.java.bak +++ /dev/null @@ -1,14 +0,0 @@ -package fr.openmc.core.disabled.corporation; - -import lombok.Getter; - -@Getter -public enum MethodState { - SUCCESS, - WARNING, - ERROR, - FAILURE, - ESCAPE, - SPECIAL - -} 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..c13a28aad 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.shops.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.shops.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 index 8633a054e..ed1d099e4 100644 --- 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 @@ -13,7 +13,7 @@ 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.bukkit.ItemUtils; +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; 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 d161d5b77..73d410354 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.shops.MethodState; +import fr.openmc.core.features.shops.data.MerchantData; +import fr.openmc.core.features.shops.data.TransactionData; +import fr.openmc.core.disabled.corporation.CompanyManager; +import fr.openmc.core.features.shops.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.shops.models.Shop; +import fr.openmc.core.features.shops.shops.ShopOwner; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.utils.types.Queue; import fr.openmc.core.utils.bukkit.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 02045a289..d2671d659 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.shops.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.bukkit.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 798acc474..c84eba183 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.shops.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 cfd5d1a89..72430dc39 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.shops.data.MerchantData; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.items.CustomItemRegistry; import fr.openmc.core.utils.bukkit.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 5b2eb6a96..c50dacfda 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 e4d729384..d36055867 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.shops.manager.ShopManager; +import fr.openmc.core.features.shops.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 index 2caa6022e..e69de29bb 100644 --- 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 @@ -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, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getItems().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_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, OMCRegistry.CUSTOM_ITEMS.get("_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 index 28037aa11..e69de29bb 100644 --- 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 @@ -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.bukkit.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, OMCRegistry.CUSTOM_ITEMS.get("_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, OMCRegistry.CUSTOM_ITEMS.get("_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, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_cancel").getBest(), itemMeta -> { - itemMeta.setDisplayName("§7Fermer"); - }).setCloseButton()); - - content.put(19, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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, OMCRegistry.CUSTOM_ITEMS.get("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 index 927f02f1a..e69de29bb 100644 --- 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 @@ -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, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_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, OMCRegistry.CUSTOM_ITEMS.get("_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 index c58ceb39c..e69de29bb 100644 --- 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 @@ -1,170 +0,0 @@ -package fr.openmc.core.disabled.corporation.menu.shop; - -import dev.lone.itemsadder.api.FontImages.FontImageWrapper; -import fr.openmc.api.input.dialog.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.bukkit.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.text.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, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - ItemBuilder searchButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_search").getBest().getType(), itemMeta -> - itemMeta.setDisplayName("Rechercher")); - if ((getPage() != 0 && !isLastPage()) || !CompanyManager.getShops().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_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 index f208cbc9a..e69de29bb 100644 --- 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 @@ -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.bukkit.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, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_cancel").getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_next_orange").getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_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, OMCRegistry.CUSTOM_ITEMS.get("_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/DBShopSale.java.bak b/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopSale.java.bak deleted file mode 100644 index 169c9b495..000000000 --- a/src/main/java/fr/openmc/core/disabled/corporation/models/DBShopSale.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_sales") -public class DBShopSale { - @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; - @DatabaseField(canBeNull = false) - private double price; - @DatabaseField(canBeNull = false) - private int amount; - - DBShopSale() { - // required for ORMLite - } - - public DBShopSale(byte[] items, UUID shop, double price, int amount, UUID saleUuid) { - this.items = items; - this.shop = shop; - this.price = price; - this.amount = amount; - this.saleUuid = saleUuid; - } - - public ShopItem deserialize() { - ItemStack item = ItemStack.deserializeBytes(items); - ShopItem shopItem = new ShopItem(item, price, saleUuid); - 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 4b1f88b84..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.bukkit.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 index dfd4fe628..e69de29bb 100644 --- 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 @@ -1,87 +0,0 @@ -package fr.openmc.core.disabled.corporation.shops; - -import fr.openmc.core.utils.bukkit.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/credits/Credits.java b/src/main/java/fr/openmc/core/features/credits/Credits.java index 1de9f339a..bf53ba027 100644 --- a/src/main/java/fr/openmc/core/features/credits/Credits.java +++ b/src/main/java/fr/openmc/core/features/credits/Credits.java @@ -21,6 +21,7 @@ import fr.openmc.core.features.privatemessage.PrivateMessageManager; import fr.openmc.core.features.quests.QuestsManager; import fr.openmc.core.features.settings.PlayerSettingsManager; +import fr.openmc.core.features.shops.manager.ShopManager; import fr.openmc.core.features.tickets.TicketManager; import fr.openmc.core.features.tpa.TPAManager; import lombok.Getter; @@ -58,6 +59,7 @@ public enum Credits { PRIVATEMESSAGE(Material.ZOMBIE_HEAD, "feature.credits.feature.privatemessage", PrivateMessageManager.class), QUEST(OMCRegistry.CUSTOM_ITEMS.get("omc_homes:omc_homes_icon_chateau").getBest(), "feature.credits.feature.quest", QuestsManager.class), SETTINGS(Material.REDSTONE_TORCH, "feature.credits.feature.settings", PlayerSettingsManager.class), + SHOPS(Material.BARREL, "feature.credits.feature.shops", ShopManager.class), TICKETS(Material.BOOK, "feature.credits.feature.tickets", TicketManager.class), TPA(Material.ENDER_PEARL, "feature.credits.feature.tpa", TPAManager.class), RTP(Material.ENDER_PEARL, "feature.credits.feature.rtp", Set.of("miseur")), 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 fe79c9041..88ed6260b 100644 --- a/src/main/java/fr/openmc/core/features/economy/EconomyManager.java +++ b/src/main/java/fr/openmc/core/features/economy/EconomyManager.java @@ -16,6 +16,7 @@ import fr.openmc.core.features.economy.models.EconomyPlayer; import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.math.BigDecimal; @@ -239,4 +240,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/features/shops/ShopFurniture.java b/src/main/java/fr/openmc/core/features/shops/ShopFurniture.java new file mode 100644 index 000000000..79a69c685 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/ShopFurniture.java @@ -0,0 +1,34 @@ +package fr.openmc.core.features.shops; + +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/shops/commands/ShopAdminCommand.java.bak b/src/main/java/fr/openmc/core/features/shops/commands/ShopAdminCommand.java.bak new file mode 100644 index 000000000..c27a63c95 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/commands/ShopAdminCommand.java.bak @@ -0,0 +1,109 @@ +package fr.openmc.core.features.shops.commands; + +import fr.openmc.core.features.shops.ShopFurniture; +import fr.openmc.core.features.shops.commands.autocomplete.ShopAdminCommandPlayerAutocomplete; +import fr.openmc.core.features.shops.manager.PlayerShopManager; +import fr.openmc.core.features.shops.manager.ShopManager; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.Location; +import org.bukkit.Material; +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("multiblock set") + public void setShopMultiblock(Player player, @Named("playerShop") @SuggestWith(ShopAdminCommandPlayerAutocomplete.class) OfflinePlayer playerShop, @Named("barrelLoc") Location barrelLoc) { + if (playerShop == null) return; + + Shop shop = ShopManager.getPlayerShop(playerShop.getUniqueId()); + if (shop == null) { + MessagesManager.sendMessage(player, Component.text("§cCe joueur n'a pas de shop, ou n'a pas été trouvé."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + Location cashLoc = barrelLoc.clone().add(0, 1, 0); + + Shop.Multiblock multiblock = shop.getMultiblock(); + if (multiblock == null) { + multiblock = new Shop.Multiblock(barrelLoc, cashLoc); + if (!shop.setMultiblock(multiblock)) { + MessagesManager.sendMessage(player, Component.text("§cImpossible de poser le multiblock car un des blocks n'est pas valide."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + MessagesManager.sendMessage(player, Component.text("§aMultiblock associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + return; + } + + Location shopBarrelLoc = multiblock.stockBlockLoc(); + if (shopBarrelLoc != null) { + if (shopBarrelLoc == barrelLoc) { + MessagesManager.sendMessage(player, Component.text("§cCe barrel est déjà associé au shop."), Prefix.SHOP, MessageType.WARNING, false); + } else { + if (shopBarrelLoc.getBlock().getType() != Material.BARREL) { + MessagesManager.sendMessage(player, Component.text("§cAucune barrel détecté."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + shopBarrelLoc.set(barrelLoc.x(), barrelLoc.y(), barrelLoc.z()); + MessagesManager.sendMessage(player, Component.text("§aBarrel associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + } + } else { + shopBarrelLoc = barrelLoc; + MessagesManager.sendMessage(player, Component.text("§aBarrel associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + } + + Location shopCashLoc = multiblock.cashBlockLoc(); + if (shopCashLoc != null) { + if (shopCashLoc == cashLoc) { + MessagesManager.sendMessage(player, Component.text("§cCe cash est déjà associé au shop."), Prefix.SHOP, MessageType.WARNING, false); + } else { + if (shopCashLoc.getBlock().getType() != Material.OAK_SIGN && !ShopFurniture.hasFurniture(shopCashLoc.getBlock())) { + MessagesManager.sendMessage(player, Component.text("§cAucune cash ou panneau détecté."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + shopCashLoc.set(cashLoc.x(), cashLoc.y(), cashLoc.z()); + MessagesManager.sendMessage(player, Component.text("§aCash associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + } + } else { + shopCashLoc = cashLoc; + MessagesManager.sendMessage(player, Component.text("§aCash associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + } + + shop.setMultiblock(new Shop.Multiblock(shopBarrelLoc, shopCashLoc)); + MessagesManager.sendMessage(player, Component.text("§aMultiblock associé au shop."), Prefix.SHOP, MessageType.SUCCESS, false); + } + + @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.getItem().getAmount() > 0) { + 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/shops/commands/ShopCommand.java b/src/main/java/fr/openmc/core/features/shops/commands/ShopCommand.java new file mode 100644 index 000000000..e4e86b45a --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/commands/ShopCommand.java @@ -0,0 +1,59 @@ +package fr.openmc.core.features.shops.commands; + +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.manager.PlayerShopManager; +import fr.openmc.core.features.shops.manager.ShopManager; +import fr.openmc.core.features.shops.menu.ShopSearchMenu; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Cooldown; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.Subcommand; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +@Command("shop") +@Description("Manage shops") +@CommandPermission("omc.commands.shop") +public class ShopCommand { + + @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("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("search") + @Description("Recherche un shop") + public void searchShop(Player player){ + new ShopSearchMenu(player).open(); + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java b/src/main/java/fr/openmc/core/features/shops/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java new file mode 100644 index 000000000..9e16ab3da --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/commands/autocomplete/ShopAdminCommandPlayerAutocomplete.java @@ -0,0 +1,24 @@ +package fr.openmc.core.features.shops.commands.autocomplete; + +import fr.openmc.core.features.shops.manager.ShopManager; +import fr.openmc.core.features.shops.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/shops/listener/ShopListener.java b/src/main/java/fr/openmc/core/features/shops/listener/ShopListener.java new file mode 100644 index 000000000..ccb32c511 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/listener/ShopListener.java @@ -0,0 +1,133 @@ +package fr.openmc.core.features.shops.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.shops.manager.ShopManager; +import fr.openmc.core.features.shops.menu.ShopMenu; +import fr.openmc.core.features.shops.menu.ShopSellingMenu; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.Tag; +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.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 e) { + if (ShopManager.getShopAt(e.getBlock().getLocation()) != null) e.setCancelled(true); + } + + @EventHandler + public void onShopExplode(BlockExplodeEvent e) { + e.blockList().removeIf(block -> ShopManager.getShopAt(block.getLocation()) != null); + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent e) { + e.blockList().removeIf(block -> ShopManager.getShopAt(block.getLocation()) != null); + } + + @EventHandler + public void onShopClick(PlayerInteractEvent e) { + Block block = e.getClickedBlock(); + if (block == null) return; + if (!block.getType().equals(Material.OAK_SIGN)) 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(block.getType())) return; + + if (e.getAction() != Action.RIGHT_CLICK_BLOCK) return; + + Shop shop = ShopManager.getShopAt(block.getLocation().subtract(0, 1, 0)); + if (shop == null) return; + + e.setCancelled(true); + if (shop.hasItem()) new ShopMenu(e.getPlayer(), shop).open(); + else new ShopSellingMenu(e.getPlayer(), shop).open(); + } + + @EventHandler + public void onInteractWithBlock(PlayerInteractEvent e) { + if (e.getAction() != Action.RIGHT_CLICK_BLOCK) return; + 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; + } + + Player player = e.getPlayer(); + if (!shop.getOwnerUUID().equals(player.getUniqueId())) { + e.setCancelled(true); + MessagesManager.sendMessage(player, Component.text("§cCeci n'est pas votre shop."), Prefix.SHOP, MessageType.WARNING, 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 e) { + CustomFurniture furniture = e.getFurniture(); + + if (furniture != null && furniture.getNamespacedID().equals("omc_company:caisse")) e.setCancelled(true); + } + + @EventHandler + public void onFurnitureInteract(FurnitureInteractEvent e) { + CustomFurniture furniture = e.getFurniture(); + + if (furniture == null) return; + + if (!furniture.getNamespacedID().equals("omc_company:caisse")) return; + + Player player = e.getPlayer(); + if (furniture.getEntity() == null) { + MessagesManager.sendMessage(player, 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(player, 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); + if (shop.hasItem()) new ShopMenu(player, shop).open(); + else new ShopSellingMenu(player, shop).open(); + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/manager/PlayerShopManager.java b/src/main/java/fr/openmc/core/features/shops/manager/PlayerShopManager.java new file mode 100644 index 000000000..009075a73 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/PlayerShopManager.java @@ -0,0 +1,151 @@ +package fr.openmc.core.features.shops.manager; + +import fr.openmc.api.input.location.ItemInteraction; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.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.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), + "shops:shop_creator", + 300, + Component.text("§6Vous avez reçu un tonneau pour poser votre shop"), + Component.text("§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 = shop.getMultiblock().stockBlockLoc().getBlock(); + Block cashBlock = shop.getMultiblock().cashBlockLoc().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); + } + + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.saveDBShop(shop)) { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la création du shop (cannot save shop location), essai de retrait du shop... §bVous, appelez un admin ou faites un ticket sur le discord d'OpenMC"), Prefix.SHOP, MessageType.ERROR, false); + OMCLogger.error("Error when saving shop location for player {}! Trying to remove shop...", player.getName()); + if (!ShopManager.removeShop(shop)) MessagesManager.sendMessage(player, Component.text("§cImpossible de retirer le shop, tentez d'appeller un admin ou faites un ticket sur le discord d'OpenMC"), Prefix.SHOP, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.text("§6La création de shop n'ayant pas été possible, 500 " + EconomyManager.getEconomyIcon() + " vous ont été remboursés"), Prefix.SHOP, MessageType.INFO, true); + } + else { + 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 { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la création du shop (multiblock is null) : §bappelez un admin ou faites un ticket sur le discord d'OpenMC"), 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, Shop shop) { + if (shop == null) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas de shop, ou celui-ci est introuvable"), Prefix.SHOP, MessageType.WARNING, false); + return; + } + + if (shop.getItem() != null && shop.getItem().getAmount() > 0) { + 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 : appelez un admin ou faites un ticket sur le discord d'OpenMC"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.deleteDBShop(shop)) { + MessagesManager.sendMessage(player, Component.text("§cErreur lors de la suppression du shop dans la database : veuillez faire un ticket sur le discord d'OpenMC pour signaler cet incident."), Prefix.SHOP, MessageType.ERROR, false); + OMCLogger.error("Error when " + player.getName() + " trying to delete his shop!"); + } + }); + + 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.deleteDBShop(shop)) { + MessagesManager.sendMessage(admin, Component.text("§cErreur lors de la suppression du shop dans la db"), 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/shops/manager/ShopDatabaseManager.java b/src/main/java/fr/openmc/core/features/shops/manager/ShopDatabaseManager.java new file mode 100644 index 000000000..5f700a8dd --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/ShopDatabaseManager.java @@ -0,0 +1,90 @@ +package fr.openmc.core.features.shops.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.bootstrap.integration.OMCLogger; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.features.shops.models.ShopItem; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.jspecify.annotations.NonNull; + +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; + private static Dao shopItemDao; + + public static void initDB(ConnectionSource connectionSource) throws SQLException { + TableUtils.createTableIfNotExists(connectionSource, Shop.class); + shopDao = DaoManager.createDao(connectionSource, Shop.class); + + TableUtils.createTableIfNotExists(connectionSource, ShopItem.class); + shopItemDao = DaoManager.createDao(connectionSource, ShopItem.class); + } + + public static @NonNull Map loadDBShops() throws SQLException { + Map shopsByLocation = new HashMap<>(); + + List shops = shopDao.queryForAll(); + for (Shop shop : shops) { + Location loc = new Location(Bukkit.getWorld("world"), shop.getX(), shop.getY(), shop.getZ()); + if (shop.getMultiblock() == null) { + if (!shop.setMultiblock(new Shop.Multiblock(loc, loc.clone().add(0, 1, 0)))) { + OMCLogger.error("Cannot set multiblock for {}, but shop is registered", shop.getName()); + } + } + shopsByLocation.put(loc, shop); + } + return shopsByLocation; + } + + public static void loadDBShopItems() throws SQLException { + List shopItems = shopItemDao.queryForAll(); + for (ShopItem item : shopItems) { + Shop shop = ShopManager.getShopByUUID(item.getShopUUID()); + if (shop == null) { + OMCLogger.error("Shop for item with shopUUID " + item.getShopUUID() + " is null, item not assigned"); + continue; + } + shop.setItem(item); + } + } + + public static boolean saveDBShopItem(ShopItem item) { + try { + shopItemDao.createOrUpdate(item); + return true; + } catch (SQLException e) { + OMCLogger.error("Failed to save shop item for owner UUID: {}\nCause: {}", item.getShop().getOwnerUUID(), e.getCause()); + return false; + } + } + + public static boolean saveDBShop(Shop shop) { + try { + shopDao.createOrUpdate(shop); + return true; + } catch (SQLException e) { + OMCLogger.error("Failed to save shop for owner UUID: {}\nCause: {}", shop.getOwnerUUID(), e.getCause()); + return false; + } + } + + public static boolean deleteDBShop(Shop shop) { + try { + shopDao.delete(shop); + return true; + } catch (SQLException e) { + OMCLogger.error("Failed to delete shop for owner UUID: {}\nCause: {}", shop.getOwnerUUID(), e.getCause()); + return false; + } + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/manager/ShopManager.java b/src/main/java/fr/openmc/core/features/shops/manager/ShopManager.java new file mode 100644 index 000000000..222a9aecd --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/ShopManager.java @@ -0,0 +1,243 @@ +package fr.openmc.core.features.shops.manager; + +import com.j256.ormlite.support.ConnectionSource; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.bootstrap.features.Feature; +import fr.openmc.core.bootstrap.features.annotations.Credit; +import fr.openmc.core.bootstrap.features.types.DatabaseFeature; +import fr.openmc.core.bootstrap.features.types.HasCommands; +import fr.openmc.core.bootstrap.features.types.HasListeners; +import fr.openmc.core.bootstrap.features.types.LoadAfterItemsAdder; +import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.core.features.shops.ShopFurniture; +import fr.openmc.core.features.shops.commands.ShopCommand; +import fr.openmc.core.features.shops.listener.ShopListener; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; +import fr.openmc.core.utils.world.WorldUtils; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +@Credit(developers = {"gab400", "Nocolm", "Xernas78"}, graphist = {"Gexary"}) +public class ShopManager extends Feature implements LoadAfterItemsAdder, DatabaseFeature, HasListeners, HasCommands { + + @Getter + private static final Map shops = new HashMap<>(); + private static Map shopsByLocation; + + @Override + protected void init() { + loadShops(); + loadShopItems(); + } + + @Override + protected void save() { + saveShops(); + saveShopItems(); + } + + @Override + public void initDB(ConnectionSource connectionSource) throws SQLException { + ShopDatabaseManager.initDB(connectionSource); + } + + @Override + public Set getCommands() { + return Set.of(new ShopCommand()); + } + + @Override + public Set getListeners() { + return Set.of(new ShopListener()); + } + + public static boolean loadShops() { + if (shopsByLocation != null) shopsByLocation.clear(); + try { + shopsByLocation = ShopDatabaseManager.loadDBShops(); + } catch (SQLException e) { + OMCLogger.error("Cannot save shops from database: " + e.getCause()); + return false; + } + + shopsByLocation.values().forEach(shop -> setUUIDShop(shop.getShopUUID(), shop)); + OMCLogger.info("Successfully loaded {} shops from database.", shops.size()); + return true; + } + + public static boolean loadShopItems() { + try { + ShopDatabaseManager.loadDBShopItems(); + OMCLogger.info("Successfully loaded shop items from database."); + return true; + } catch (SQLException e) { + OMCLogger.error("Cannot save shop items from database: " + e.getCause()); + return false; + } + } + + public static boolean saveShops() { + for (Shop shop : shops.values()) { + if (!ShopDatabaseManager.saveDBShop(shop)) { + OMCLogger.error("Failed to save " + shop.getName() + " to database."); + } + } + return true; + } + + public static boolean saveShopItems() { + for (Shop shop : shops.values()) { + if (!shop.hasItem()) continue; + if (!ShopDatabaseManager.saveDBShopItem(shop.getItem())) { + OMCLogger.error("Failed to save " + shop.getName() + " item to database."); + } + } + 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.cashBlockLoc().getBlock(); + + shopsByLocation.put(shop.getLocation(), shop); + shops.put(shop.getShopUUID(), shop); + + if (ItemsAdderHook.isEnable()) { + 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) { + OMCLogger.error("Multiblock for {} is null!", shop.getName()); + return false; + } + + World world = Bukkit.getWorld("world"); + if (world == null) { + OMCLogger.error("World 'world' not found while removing {} at location: {}", shop.getName(), shop.getLocation()); + return false; + } + + Block cashBlock = world.getBlockAt(multiblock.cashBlockLoc()); + Block stockBlock = world.getBlockAt(multiblock.stockBlockLoc()); + + if (ItemsAdderHook.isEnable()) { + if (!ShopFurniture.hasFurniture(cashBlock)) { + if (!ShopFurniture.removeShopFurniture(cashBlock)) return false; + } + else if ((cashBlock.getType() != Material.OAK_SIGN && cashBlock.getType() != Material.BARRIER) || stockBlock.getType() != Material.BARREL) 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())); + shops.remove(shop.getShopUUID()); + }); + return true; + } + + /** + * Returns all registered shops + * + * @return a set of shops + */ + public static Set getAllShops() { + return Set.copyOf(shops.values()); + } + + public static Shop getShopByUUID(UUID shopUUID) { + return shops.get(shopUUID); + } + + /** + * Assign a shop to a player if any shop was already assigned + * + * @param shopUUID the UUID of the player + * @param shop the shop + */ + public static void setUUIDShop(UUID shopUUID, Shop shop) { + shops.put(shopUUID, 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) { + for (Shop shop : shops.values()) { + if (shop.isOwner(playerUUID)) return true; + } + return false; + } + + public static boolean isShopOwner(Player player, Shop shop) { + return isShopOwner(player.getUniqueId(), shop); + } + + public static boolean isShopOwner(UUID playerUUID, Shop shop) { + return shop.getOwnerUUID().equals(playerUUID); + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/menu/ShopCatalogMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopCatalogMenu.java new file mode 100644 index 000000000..e4adf6d01 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopCatalogMenu.java @@ -0,0 +1,81 @@ +package fr.openmc.core.features.shops.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 net.kyori.adventure.text.Component; +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 ShopCatalogMenu extends PaginatedMenu { + + public ShopCatalogMenu(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 Component getName() { + return Component.text("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/shops/menu/ShopMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopMenu.java new file mode 100644 index 000000000..8ad608e4b --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopMenu.java @@ -0,0 +1,197 @@ +package fr.openmc.core.features.shops.menu; + +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.template.ConfirmMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.manager.PlayerShopManager; +import fr.openmc.core.features.shops.manager.ShopManager; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.features.shops.models.ShopItem; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +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; + private final Shop shop; + private final ShopItem item; + private final boolean isShopOwner; + + private final InventorySize size; + private final String texture; + + public ShopMenu(Player owner, Shop shop) { + super(owner); + this.shop = shop; + this.item = shop.getItem(); + this.isShopOwner = ShopManager.isShopOwner(owner, shop); + this.size = isShopOwner ? InventorySize.LARGER : InventorySize.LARGE; + this.texture = isShopOwner ? "shop_menu" : "sell_shop_menu"; + } + + @Override + public @NotNull Component getName() { + return Component.text("Menu du shop de " + shop.getOwner().getName()); + } + + @Override + public String getTexture() { + return "§r§f:offset_-11::" + this.texture + ":"; + } + + @Override + public @NotNull InventorySize getInventorySize() { + return this.size; + } + + @Override + public void onInventoryClick(InventoryClickEvent event) { + switch (event.getSlot()) { + case 10, 11, 12, 14, 15, 16, 19, 20, 21, 23, 24, 25 -> update(); + } + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public @NotNull Map getContent() { + Map map = new HashMap<>(); + + if (this.isShopOwner) { + map.put(0, new ItemBuilder(this, Material.RED_DYE, itemMeta -> { + itemMeta.displayName(Component.text("§4Supprimer le shop")); + itemMeta.lore(List.of( + Component.text("§6Retirer tout l'argent et les items est nécessaire pour supprimer le shop."), + Component.text("§4§lATTENTION, IL SERA IMPOSSIBLE DE REVENIR EN ARRIÈRE !") + )); + }).setOnClick(_ -> new ConfirmMenu( + getOwner(), + () -> { + getOwner().closeInventory(); + PlayerShopManager.deleteShop(getOwner(), shop); + }, + () -> new ShopMenu(getOwner(), shop).open(), + List.of(Component.text("§4Supprimer DÉFINITIVEMENT le shop.")), + List.of(Component.text("§9Revenir dans le menu du shop.")) + ).open())); + + map.put(3, new ItemBuilder(this, Material.PAPER, itemMeta -> { + itemMeta.displayName(Component.text("§dAccéder aux ventes du shop")); + if (this.item == null) itemMeta.lore(List.of(Component.text("§cAucune statistique disponible, car aucun item n'est en vente."))); + }).setOnClick(_ -> { + if (this.item != null) new ShopSalesMenu(getOwner()).open(); + })); + + map.put(4, new ItemBuilder(this, Material.GOLD_INGOT, itemMeta -> { + itemMeta.displayName(Component.text("§6Accéder aux statistiques du shop")); + if (this.item == null) itemMeta.lore(List.of(Component.text("§cAucune statistique disponible, car aucun item n'est en vente."))); + }).setOnClick(_ -> { + if (this.item != null) new ShopStatsMenu(getOwner(), this.shop).open(); + })); + + map.put(5, new ItemBuilder(this, Material.BARREL, itemMeta -> { + itemMeta.displayName(Component.text("§bAccéder aux stocks du shop")); + if (this.item == null) itemMeta.lore(List.of(Component.text("§cImpossible d'accéder aux stocks, car aucun item n'est en vente."))); + }).setOnClick(_ -> { + if (this.item != null) new ShopStocksMenu(getOwner(), shop).open(); + })); + + map.put(8, new ItemBuilder(this, Material.GREEN_BANNER, itemMeta -> itemMeta.displayName(Component.text("§aCe shop est le vôtre")))); + } + + map.put(isShopOwner ? 19 : 10, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:64_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§cRetirer 64")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR RETIRER 64") + )); + }).setOnClick(_ -> removeAmount(64))); + map.put(isShopOwner ? 20 : 11, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:10_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§cRetirer 10")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR RETIRER 10") + )); + }).setOnClick(_ -> removeAmount(10))); + map.put(isShopOwner ? 21 : 12, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:minus_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§cRetirer 1")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR RETIRER 1") + )); + }).setOnClick(_ -> removeAmount(1))); + + map.put(isShopOwner ? 23 : 14, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:plus_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§aAjouter 1")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR AJOUTER 1") + )); + }).setOnClick(_ -> addAmount(1))); + map.put(isShopOwner ? 24 : 15, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:10_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§aAjouter 10")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR AJOUTER 10") + )); + }).setOnClick(_ -> addAmount(10))); + map.put(isShopOwner ? 25 : 16, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:64_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§aAjouter 64")); + itemMeta.lore(List.of( + Component.text("§e§lCLIQUEZ ICI POUR AJOUTER 64") + )); + }).setOnClick(_ -> addAmount(64))); + + map.put(22, new ItemBuilder(this, this.item.getItemStack().asOne())); + map.put(isShopOwner ? 30 : 21, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:refuse_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§cRefuser l'achat")); + itemMeta.lore(List.of( + Component.text("§6Vous refusez d'acheter " + this.amountToBuy + " item(s)"), + Component.text("§e§lCLIQUEZ ICI POUR REFUSER L'ACHAT") + )); + }).setCloseButton()); + map.put(isShopOwner ? 32 : 23, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("omc_menus:accept_btn").getBest(), itemMeta -> { + itemMeta.displayName(Component.text("§aAccepter l'achat")); + itemMeta.lore(List.of( + Component.text("§6Cela vous coûtera " + this.item.getPrice(this.amountToBuy) + " " + EconomyManager.getEconomyIcon() + " §6pour " + this.amountToBuy + " item(s)"), + Component.text("§e§lCLIQUEZ ICI POUR ACCEPTER L'ACHAT") + )); + }).setOnClick(_ -> this.shop.buy(getOwner(), this.amountToBuy))); + + return map; + } + + @Override + public List getTakableSlot() { + return List.of(); + } + + private void addAmount(int amount) { + if (this.item == null || this.item.getAmount() == 0) return; + if (amount <= 0) return; + if ((amountToBuy + amount) > this.item.getAmount()) { + amountToBuy = this.item.getAmount(); + return; + } + this.amountToBuy += amount; + } + + private void removeAmount(int amount) { + if (this.item == null || this.item.getAmount() == 0) return; + if (amount <= 0) return; + if ((amountToBuy - amount) < 0) { + amountToBuy = 1; + return; + } + this.amountToBuy -= amount; + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/menu/ShopSalesMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopSalesMenu.java new file mode 100644 index 000000000..2e3f952c2 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopSalesMenu.java @@ -0,0 +1,84 @@ +package fr.openmc.core.features.shops.menu; + +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 net.kyori.adventure.text.Component; +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 map = new HashMap<>(); + + return map; + } + + @Override + public @NotNull Component getName() { + return Component.text("Ventes de "); + } + + @Override + public String getTexture() { + return "§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/shops/menu/ShopSearchMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopSearchMenu.java new file mode 100644 index 000000000..a71a4be2d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopSearchMenu.java @@ -0,0 +1,80 @@ +package fr.openmc.core.features.shops.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 net.kyori.adventure.text.Component; +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 Component getName() { + return Component.text("§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/shops/menu/ShopSellingMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopSellingMenu.java new file mode 100644 index 000000000..73ed61da1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopSellingMenu.java @@ -0,0 +1,98 @@ +package fr.openmc.core.features.shops.menu; + +import fr.openmc.api.input.dialog.DialogInput; +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.features.shops.models.ShopItem; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.block.Barrel; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class ShopSellingMenu extends Menu { + + private final Shop shop; + private final Inventory barrelInventory; + private double price; + + public ShopSellingMenu(Player owner, Shop shop) { + super(owner); + this.shop = shop; + this.barrelInventory = ((Barrel) shop.getMultiblock().stockBlockLoc().getBlock().getState()).getSnapshotInventory(); + } + + @Override + public @NotNull Component getName() { + return Component.text("Menu de vente"); + } + + @Override + public String getTexture() { + return "§r§f:offset_-11::large_shop_menu:"; + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGEST; + } + + @Override + public void onInventoryClick(InventoryClickEvent e) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public @NotNull Map getContent() { + Map map = new HashMap<>(); + + List items = getUniqueItemStacks(barrelInventory.getContents()).stream().toList(); + for (int i = 0; i < items.size(); i++) { + ItemStack item = items.get(i); + map.put(i, new ItemBuilder(this, item, itemMeta -> { + if (itemMeta.hasLore()) itemMeta.lore().add(Component.text("§l§8CLIQUEZ ICI POUR SELECTIONNER CET ITEM À VENDRE")); + else itemMeta.lore(List.of(Component.text("§l§8CLIQUEZ ICI POUR SELECTIONNER CET ITEM À VENDRE"))); + }).setOnClick(_ -> DialogInput.send(getOwner(), + Component.text("§6Entrez le prix auquel vous voulez vendre votre item :"), + Integer.MAX_VALUE, + s -> { + double price = Double.parseDouble(s); + if (Double.isNaN(price)) return; + if (price <= 0) return; + shop.setItem(new ShopItem(shop.getShopUUID(), item, price)); + new ShopMenu(getOwner(), shop).open(); + MessagesManager.sendMessage(getOwner(), Component.text("§aItem ajouté au shop."), Prefix.SHOP, MessageType.SUCCESS, true); + }))); + } + return map; + } + + @Override + public List getTakableSlot() { + return List.of(); + } + + private Set getUniqueItemStacks(ItemStack[] items) { + Set itemStacks = new HashSet<>(); + for (ItemStack item : items) { + if (item == null) continue; + itemStacks.add(item.asOne()); + } + return itemStacks; + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/menu/ShopStatsMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopStatsMenu.java new file mode 100644 index 000000000..4668b3430 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopStatsMenu.java @@ -0,0 +1,85 @@ +package fr.openmc.core.features.shops.menu; + +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.core.OMCRegistry; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.models.Shop; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +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.*; + +public class ShopStatsMenu extends Menu { + + private final Shop shop; + private int totalSoldItems = 0; + private final Set totalUniquePlayers = new HashSet<>(); + + protected ShopStatsMenu(Player owner, Shop shop) { + super(owner); + this.shop = shop; + if (shop.getItem() == null) owner.closeInventory(); + if (!shop.getSales().isEmpty()) { + shop.getSales().values().forEach(tuple -> { + totalSoldItems += tuple.getB().getAmount(); + totalUniquePlayers.add(tuple.getA()); + }); + } + } + + @Override + public @NotNull Component getName() { + return Component.text("Statistiques"); + } + + @Override + public String getTexture() { + return ""; + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.NORMAL; + } + + @Override + public void onInventoryClick(InventoryClickEvent e) { + + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + @Override + public @NotNull Map getContent() { + Map map = new HashMap<>(); + + map.put(11, new ItemBuilder(this, Material.PAPER, itemMeta -> + itemMeta.displayName(Component.text("§aTotal de ventes : " + this.shop.getSales().size())))); + map.put(12, new ItemBuilder(this, Material.GOLD_INGOT, itemMeta -> + itemMeta.displayName(Component.text("§2Total d'items vendus : " + this.totalSoldItems)))); + map.put(13, new ItemBuilder(this, Material.GOLD_BLOCK, itemMeta -> + itemMeta.displayName(Component.text("§6Chiffre d'affaires : " + this.shop.getTurnover() + " " + EconomyManager.getEconomyIcon())))); + map.put(14, new ItemBuilder(this, Material.PLAYER_HEAD, itemMeta -> + itemMeta.displayName(Component.text("§dTotal d'acheteurs uniques : " + this.totalUniquePlayers.size())))); + map.put(15, new ItemBuilder(this, Material.BARREL, itemMeta -> + itemMeta.displayName(Component.text("§bItems restants dans les stocks : " + this.shop.getItem().getAmount())))); + + map.put(18, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_back_orange").getBest(), _ -> new ShopMenu(getOwner(), shop).open())); + + return map; + } + + @Override + public List getTakableSlot() { + return List.of(); + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/menu/ShopStocksMenu.java b/src/main/java/fr/openmc/core/features/shops/menu/ShopStocksMenu.java new file mode 100644 index 000000000..758006b06 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopStocksMenu.java @@ -0,0 +1,116 @@ +package fr.openmc.core.features.shops.menu; + +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.OMCRegistry; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.features.shops.models.ShopItem; +import fr.openmc.core.utils.bukkit.ContainerUtils; +import fr.openmc.core.utils.bukkit.ItemUtils; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.block.Barrel; +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 { + + private final Shop shop; + + private final int barrelStocks; + + public ShopStocksMenu(Player owner, Shop shop) { + super(owner); + this.shop = shop; + this.barrelStocks = ContainerUtils.getTotalItemsIn((Barrel) this.shop.getMultiblock().stockBlockLoc().getBlock().getState(), this.shop.getItem().getItemStack()); + } + + @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() { + ShopItem item = this.shop.getItem(); + if (item == null) return List.of(); + return ItemUtils.splitAmountIntoStack(item.getItemStack(), item.getAmount()); + } + + @Override + public Map getButtons() { + Map map = new HashMap<>(); + + map.put(45, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.get("_iainternal:icon_back_orange").getBest(), itemMeta -> + itemMeta.displayName(Component.text("§dRetour au menu du shop")) + ).setOnClick(_ -> new ShopMenu(getOwner(), shop).open())); + map.put(49, new ItemBuilder(this, Material.BARREL, itemMeta -> { + itemMeta.displayName(Component.text("§aRemplir depuis le tonneau (" + barrelStocks + "§a items disponibles)")); + }).setOnClick(_ -> { + if (barrelStocks == 0) return; + ShopItem item = this.shop.getItem(); + int amountToAdd = 28 * item.getItemStack().getMaxStackSize() - item.getAmount(); + if (amountToAdd <= 0) return; + if (amountToAdd > barrelStocks) amountToAdd = barrelStocks; + ContainerUtils.removeItemsFromInventory((Barrel) this.shop.getMultiblock().stockBlockLoc().getBlock().getState(), item.getItemStack(), amountToAdd); + item.addAmout(amountToAdd); + MessagesManager.sendMessage(getOwner(), Component.text("§aStocks rechargés."), Prefix.SHOP, MessageType.SUCCESS, true); + new ShopStocksMenu(getOwner(), shop).open(); + })); + + return map; + } + + @Override + public @NotNull Component getName() { + return Component.text("Menu des Stocks"); + } + + @Override + public String getTexture() { + return "§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/shops/models/Shop.java b/src/main/java/fr/openmc/core/features/shops/models/Shop.java new file mode 100644 index 000000000..264515690 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/Shop.java @@ -0,0 +1,177 @@ +package fr.openmc.core.features.shops.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.economy.EconomyManager; +import fr.openmc.core.features.shops.ShopFurniture; +import fr.openmc.core.utils.bukkit.ItemUtils; +import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import fr.openmc.core.utils.text.messages.MessageType; +import fr.openmc.core.utils.text.messages.MessagesManager; +import fr.openmc.core.utils.text.messages.Prefix; +import lombok.Getter; +import lombok.Setter; +import net.kyori.adventure.text.Component; +import net.minecraft.util.Tuple; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.time.LocalDateTime; +import java.util.*; + +@Getter +@DatabaseTable(tableName = "shops") +public class Shop { + + @DatabaseField(id = true, columnName = "shop_uuid", canBeNull = false) + private UUID shopUUID; + @DatabaseField(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 ShopItem item; + private final Map> sales = new HashMap<>(); + + private Location location; + private Multiblock multiblock; + + @Setter + 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.shopUUID = UUID.randomUUID(); + 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)); + } + + public Player getOwner() { + return CacheOfflinePlayer.getOfflinePlayer(ownerUUID).getPlayer(); + } + + public String getName() { + return getOwner().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 boolean isOwner(Player player) { + return isOwner(player.getUniqueId()); + } + + public void addSale(Player player, ShopItem item) { + this.sales.put(LocalDateTime.now(), new Tuple<>(player.getUniqueId(), item)); + } + + public void addTurnover(double amount) { + this.turnover += amount; + } + + public double withdrawTurnover(Player player) { + if (!isOwner(player)) return 0; + if (getTurnover() <= 0) return 0; + double tempTurnover = getTurnover(); + EconomyManager.addBalance(player.getUniqueId(), tempTurnover, "salaires"); + MessagesManager.sendMessage(player, Component.text("§6Vous avez récupéré " + tempTurnover + " " + EconomyManager.getEconomyIcon() + " de votre shop."), Prefix.SHOP, MessageType.SUCCESS, false); + setTurnover(0); + return tempTurnover; + } + + public void buy(Player player, int amount) { + if (isOwner(player)) { + MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas acheter des items à votre propre shop."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + if (this.item.getAmount() < amount) { + MessagesManager.sendMessage(player, Component.text("§cLe nombre d'items achetés dépasse le nombre d'items présents dans le shop."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + if (!ItemUtils.hasEnoughSpace(player, item.getItemStack(), amount)) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez de place dans votre inventaire pour acheter ce nombre d'items."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + double totalPrice = this.item.getPrice(amount); + if (!EconomyManager.withdrawBalance(player.getUniqueId(), totalPrice, getName() + " buying")) { + MessagesManager.sendMessage(player, Component.text("§cVous n'avez pas assez d'argent pour acheter ce nombre d'items."), Prefix.SHOP, MessageType.ERROR, false); + return; + } + addSale(player, item.setAmount(amount)); + addTurnover(totalPrice); + player.give(item.getItemStack().asQuantity(amount)); + } + + /** + * 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 boolean setMultiblock(Multiblock multiblock) { + if (multiblock.stockBlockLoc.getBlock().getType() != Material.BARREL + || (multiblock.cashBlockLoc.getBlock().getType() != Material.OAK_SIGN + && !ShopFurniture.hasFurniture(multiblock.cashBlockLoc.getBlock()))) { + return false; + } + this.multiblock = multiblock; + return true; + } + + public void setItem(ShopItem item) { + if (this.item != null) return; + if (item.getPrice() < 0) return; + if (item.getItemStack() == null) return; + this.item = item; + } + + public void removeItem() { + if (this.item == null) return; + if (this.item.getAmount() > 0) return; + this.item = null; + } + + public boolean hasItem() { + return this.item != null; + } + + public record Multiblock(Location stockBlockLoc, Location cashBlockLoc) {} +} diff --git a/src/main/java/fr/openmc/core/features/shops/models/ShopItem.java b/src/main/java/fr/openmc/core/features/shops/models/ShopItem.java new file mode 100644 index 000000000..7cbfc6fb1 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/ShopItem.java @@ -0,0 +1,91 @@ +package fr.openmc.core.features.shops.models; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import fr.openmc.core.features.shops.manager.ShopManager; +import fr.openmc.core.utils.bukkit.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 +@DatabaseTable(tableName = "shop_items") +public class ShopItem { + + @DatabaseField(id = true, columnName = "shop_uuid", canBeNull = false) + private UUID shopUUID; + @DatabaseField(canBeNull = false) + private double pricePerItem; + @DatabaseField(canBeNull = false) + private int amount; + @DatabaseField(canBeNull = false, columnName = "item_bytes", dataType = DataType.BYTE_ARRAY) + private byte[] itemBytes; + + private double price; + private ItemStack itemStack; + + ShopItem() { + // required for ORMLite + } + + public ShopItem(UUID shopUUID, ItemStack itemStack, double pricePerItem) { + this.shopUUID = shopUUID; + this.itemStack = itemStack.clone(); + this.pricePerItem = pricePerItem; + this.price = pricePerItem * amount; + this.amount = 0; + } + + /** + * 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; + } + + public ShopItem addAmout(int amount) { + this.amount += amount; + this.price = pricePerItem * this.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); + } + + /** + * 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 Shop getShop() { + return ShopManager.getShopByUUID(this.shopUUID); + } +} diff --git a/src/main/java/fr/openmc/core/features/shops/models/ShopSale.java b/src/main/java/fr/openmc/core/features/shops/models/ShopSale.java new file mode 100644 index 000000000..5f3eb5efa --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/ShopSale.java @@ -0,0 +1,35 @@ +package fr.openmc.core.features.shops.models; + +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; + +@Getter +@DatabaseTable(tableName = "shop_sales") +public class ShopSale { + @DatabaseField(canBeNull = false, id = true, columnName = "shop_uuid") + private UUID shopUUID; + @DatabaseField(canBeNull = false, columnName = "sale_uuid") + private UUID saleUUID; + @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY) + private byte[] items; + @DatabaseField(canBeNull = false) + private double price; + @DatabaseField(canBeNull = false) + private int amount; + + ShopSale() { + // required for ORMLite + } + + public ShopSale(byte[] items, UUID shopUUID, double price, int amount, UUID saleUUID) { + this.shopUUID = shopUUID; + this.saleUUID = saleUUID; + this.items = items; + this.price = price; + this.amount = amount; + } +} diff --git a/src/main/java/fr/openmc/core/registry/items/CustomItem.java b/src/main/java/fr/openmc/core/registry/items/CustomItem.java index e514711e6..e316b12ba 100644 --- a/src/main/java/fr/openmc/core/registry/items/CustomItem.java +++ b/src/main/java/fr/openmc/core/registry/items/CustomItem.java @@ -6,6 +6,7 @@ import fr.openmc.core.utils.bukkit.ItemUtils; import lombok.Getter; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public abstract class CustomItem { @Getter @@ -28,7 +29,7 @@ public CustomItem(CustomItemMeta meta) { this.id = meta.getId(); } - public abstract ItemStack getVanilla(); + public abstract @NotNull ItemStack getVanilla(); public ItemStack getItemsAdder() { CustomStack stack = CustomStack.getInstance(getId()); diff --git a/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java b/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java index 7236ba298..4b34df23c 100644 --- a/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java +++ b/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java @@ -14,6 +14,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; public class CustomItemRegistry extends Registry { @@ -125,7 +126,7 @@ public void register(CustomItem item) { public void register(String name, ItemStack item) { register(name, new CustomItem(name) { @Override - public ItemStack getVanilla() { + public @NotNull ItemStack getVanilla() { return item; } }); @@ -138,7 +139,7 @@ public void register(String name, Material item) { public void register(String name, Material material, String displayName) { register(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/bukkit/ContainerUtils.java b/src/main/java/fr/openmc/core/utils/bukkit/ContainerUtils.java new file mode 100644 index 000000000..5935bc4e5 --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/bukkit/ContainerUtils.java @@ -0,0 +1,52 @@ +package fr.openmc.core.utils.bukkit; + +import org.bukkit.block.Container; +import org.bukkit.inventory.ItemStack; + +public class ContainerUtils { + + public static int getTotalItemsIn(Container container, ItemStack item) { + if (container == null || item == null) return 0; + int total = 0; + for (ItemStack itemStack : container.getSnapshotInventory().getStorageContents()) { + if (itemStack == null) continue; + if (!ItemUtils.isSimilar(item, itemStack)) continue; + total += itemStack.getAmount(); + } + return total; + } + + /** + * Retirer le nombre d'objets au container (vérification obligatoire avant execution) + * + * @param container the container whose inventory will be modified + * @param item the item to remove, must be similar to the items in the inventory {@link ItemStack} + * @param amountToRemove the number of items to remove + */ + public static int removeItemsFromInventory(Container container, ItemStack item, int amountToRemove) { + if (container == null || item == null || amountToRemove <= 0) return 0; + + int removed = 0; + ItemStack[] contents = container.getInventory().getContents(); + + for (int i = 0; i < contents.length && removed < amountToRemove; i++) { + ItemStack stack = contents[i]; + if (stack == null) continue; + + if (ItemUtils.isSimilar(stack, item)) { + int stackAmount = stack.getAmount(); + int toRemove = Math.min(amountToRemove - removed, stackAmount); + + removed += toRemove; + + if (stackAmount <= toRemove) { + container.getInventory().setItem(i, null); + } else { + stack.setAmount(stackAmount - toRemove); + } + } + } + + return removed; + } +} 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 75a92097e..d1a2b0c4a 100644 --- a/src/main/java/fr/openmc/core/utils/world/WorldUtils.java +++ b/src/main/java/fr/openmc/core/utils/world/WorldUtils.java @@ -8,15 +8,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; + } } diff --git a/src/main/resources/contents/omc_company/textures/sell_shop_menu.png b/src/main/resources/contents/omc_company/textures/sell_shop_menu.png old mode 100644 new mode 100755 index a8f7d93f4..090606ae4 Binary files a/src/main/resources/contents/omc_company/textures/sell_shop_menu.png and b/src/main/resources/contents/omc_company/textures/sell_shop_menu.png differ diff --git a/src/main/resources/contents/omc_company/textures/shop_menu.png b/src/main/resources/contents/omc_company/textures/shop_menu.png old mode 100644 new mode 100755 index 542a1e26e..152155a65 Binary files a/src/main/resources/contents/omc_company/textures/shop_menu.png and b/src/main/resources/contents/omc_company/textures/shop_menu.png differ diff --git a/src/main/resources/contents/omc_menus/configs/btn.yml b/src/main/resources/contents/omc_menus/configs/btn.yml index de38806ee..fea7dac69 100644 --- a/src/main/resources/contents/omc_menus/configs/btn.yml +++ b/src/main/resources/contents/omc_menus/configs/btn.yml @@ -22,8 +22,15 @@ items: generate: true textures: - 1_btn - 64_btn: + 10_btn: display_name: 10 + resource: + material: PAPER + generate: true + textures: + - 10_btn + 64_btn: + display_name: 64 resource: material: PAPER generate: true @@ -37,7 +44,7 @@ items: textures: - plus_btn minus_btn: - display_name: plus + display_name: moins resource: material: PAPER generate: true diff --git a/src/main/resources/contents/omc_company/textures/10_btn.png b/src/main/resources/contents/omc_menus/textures/10_btn.png similarity index 100% rename from src/main/resources/contents/omc_company/textures/10_btn.png rename to src/main/resources/contents/omc_menus/textures/10_btn.png diff --git a/src/main/resources/translations/default/credits.properties b/src/main/resources/translations/default/credits.properties index 385de50fb..0ceaf479a 100644 --- a/src/main/resources/translations/default/credits.properties +++ b/src/main/resources/translations/default/credits.properties @@ -3,7 +3,7 @@ feature.credits.menu.lore.developers=Développeur(s) : %1$s feature.credits.menu.lore.graphists=Graphiste(s) : %1$s feature.credits.menu.lore.builders=Builder(s) : %1$s feature.credits.menu.close=Fermer le menu -feature.credits.feature.adminshop=Adminshop +feature.credits.feature.adminshop=L'Adminshop feature.credits.feature.animations=Les Animations feature.credits.feature.cube=Le Cube feature.credits.feature.city=Les Villes @@ -16,29 +16,30 @@ feature.credits.feature.war=Les Guerres feature.credits.feature.notation=Les Notations feature.credits.feature.rank=Les Grades feature.credits.feature.contest=Les Contests -feature.credits.feature.weekly_events=Les Evenements Hebdomadaires +feature.credits.feature.weekly_events=Les Événements Hebdomadaires feature.credits.feature.holograms=Les Hologrammes -feature.credits.feature.economy=L'Economie -feature.credits.feature.friends=Le systeme d'ami -feature.credits.feature.homes=Le Systeme d'Home +feature.credits.feature.economy=L'Économie +feature.credits.feature.friends=Le Système d'Amis +feature.credits.feature.homes=Le Système de Homes feature.credits.feature.leaderboard=Les Classements feature.credits.feature.mailbox=La Boite aux Lettres feature.credits.feature.mainmenu=Le Menu Principal feature.credits.feature.milestones=Les Milestones feature.credits.feature.privatemessage=Les messages privés feature.credits.feature.quest=Les Quêtes -feature.credits.feature.settings=Les Paramêtres +feature.credits.feature.settings=Les Paramètres +feature.credits.feature.shops=Les Shops feature.credits.feature.tickets=Les Tickets V1 feature.credits.feature.tpa=Le Tpa feature.credits.feature.rtp=Le RTP feature.credits.feature.versionning=Le Versionning feature.credits.feature.customitems=Les Custom Items -feature.credits.feature.chronometer=Chronomêtre -feature.credits.feature.cooldown=Cooldown -feature.credits.feature.menu_lib=Systeme de Menu -feature.credits.feature.packet_menu_lib=Systeme de Menu en Packet -feature.credits.feature.errorhandler=Le systeme de gestion d'erreur +feature.credits.feature.chronometer=Les Chronomètre +feature.credits.feature.cooldown=Les Cooldowns +feature.credits.feature.menu_lib=Le Système de Menu +feature.credits.feature.packet_menu_lib=Système de Menu en Packet +feature.credits.feature.errorhandler=Le Système de gestion d'erreurs feature.credits.feature.unittest=Les tests unitaires -feature.credits.feature.orm=Systeme de base de données +feature.credits.feature.orm=Système de base de données diff --git a/src/main/resources/translations/default/shop.properties b/src/main/resources/translations/default/shop.properties new file mode 100644 index 000000000..978eafae9 --- /dev/null +++ b/src/main/resources/translations/default/shop.properties @@ -0,0 +1,28 @@ +# ** SHOP ** +# * COMMANDS +# - Global Commands +message.shop.player_has_no_shop=Vous n'avez pas de shop. +message.shop.player_has_already_shop=Vous avez déjà un shop. +message.shop.not_enough_money=Vous n'avez pas assez d'argent pour créer un shop (%1$s nécessaires). + +# - Admin Commands +message.shop.admin.target_has_no_shop=Ce joueur n'a pas de shop, ou n'a pas été trouvé. +message.shop.admin.cannot_place_multiblock=Impossible de poser le multiblock car un des block n'est pas valide. +message.shop.admin.multiblock_associated=Multiblock associé au shop. +message.shop.admin.barrel_already_associated=Ce barrel est déjà associé au shop. +message.shop.admin.no_barrel_detected=Aucun barrel détecté. +message.shop.admin.barrel_associated=Barrel associé au shop. +message.shop.admin.cash_already_associated=Ce cash est déjà associé au shop. +message.shop.admin.no_cash_detected=Aucun cash détecté. +message.shop.admin.cash_associated=Cash associé au shop. + +# - Player Commands +message.shop.creating_begin=Vous avez recu un tonneau pour poser votre shop. +message.shop.creating_cancel=Création de shop annulée. +message.shop.pay_back=Vous avez été remboursé de %1§s. +message.shop.cant_create_barrel=Impossible de créer un shop ici, l'espace du tonneau doit être libre. +message.shop.cant_create_cash=Impossible de créer un shop ici, l'espace au dessus du tonneau doit être libre. + +# - External errors +message.shop.error.cannot_save_location=Erreur lors de la création du shop (impossible de sauvegarder la position du shop) : appelez un admin +message.shop.error.cannot_remove_furniture=Erreur lors de la création du shop (impossible de retirer le meuble) : appelez un admin \ No newline at end of file