diff --git a/build.gradle b/build.gradle index 6f8926470..4e75df646 100644 --- a/build.gradle +++ b/build.gradle @@ -84,7 +84,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 { @@ -130,4 +130,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 45e2b3020..3b6764953 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -44,6 +44,8 @@ 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.shops.manager.ShopManager; import fr.openmc.core.features.tickets.TicketManager; import fr.openmc.core.features.tpa.TPAManager; import fr.openmc.core.features.updates.UpdateManager; @@ -116,7 +118,8 @@ public class OMCPlugin extends JavaPlugin { () -> new LeaderboardManager(), () -> new MainMenu(), () -> new HologramLoader(), - HomeIconCacheManager::new + HomeIconCacheManager::new, + ShopManager::new )); public final List loadedFeature = new ArrayList<>(); @@ -189,7 +192,7 @@ public void onEnable() { } }); - // * 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 430866898..ac9b65b77 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); @@ -81,7 +81,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; @@ -90,9 +90,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 e2117629a..93a6fb520 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 1a3aa4924..88f962bd2 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 ff6e0ab82..304d9c275 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 81215150e..681cd09c9 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 ceabba283..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.ICON_CANCEL, itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_NEXT_ORANGE, itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getItems().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_BACK_ORANGE, 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.ICON_BACK_ORANGE, 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 f60cb3767..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.ICON_BACK_ORANGE, 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.ICON_NEXT_ORANGE, 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.ICON_CANCEL, itemMeta -> { - itemMeta.setDisplayName("§7Fermer"); - }).setCloseButton()); - - content.put(19, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.MINUS_BTN, 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"), 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.BTN_1, 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.BTN_1.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.BTN_64.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.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.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 4f2d258c9..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.ICON_CANCEL.getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_NEXT_ORANGE, itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_BACK_ORANGE, 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.ICON_BACK_ORANGE, 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 dc8f2502e..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.ICON_CANCEL.getBest(), itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_NEXT_ORANGE.getBest(), itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - ItemBuilder searchButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_SEARCH.getType(), itemMeta -> - itemMeta.setDisplayName("Rechercher")); - if ((getPage() != 0 && !isLastPage()) || !CompanyManager.getShops().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_BACK_ORANGE, 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 080579e83..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.ICON_CANCEL, itemMeta -> itemMeta.setDisplayName("§7Fermer")) - .setCloseButton()); - ItemBuilder nextPageButton = new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_NEXT_ORANGE, itemMeta -> itemMeta.setDisplayName("§aPage suivante")); - if ((getPage() == 0 && isLastPage()) || shop.getSales().isEmpty()) { - buttons.put(48, new ItemBuilder(this, OMCRegistry.CUSTOM_ITEMS.ICON_BACK_ORANGE, 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.ICON_BACK_ORANGE, 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 12396bd39..fe4f8f41f 100644 --- a/src/main/java/fr/openmc/core/features/credits/Credits.java +++ b/src/main/java/fr/openmc/core/features/credits/Credits.java @@ -22,6 +22,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 fr.openmc.core.registry.items.CustomItem; @@ -60,6 +61,7 @@ public enum Credits { PRIVATEMESSAGE(Material.ZOMBIE_HEAD, "feature.credits.feature.privatemessage", PrivateMessageManager.class), QUEST(OMCRegistry.CUSTOM_ITEMS.HOMES_ICON_CHATEAU, "feature.credits.feature.quest", QuestsManager.class), SETTINGS(Material.REDSTONE_TORCH, "feature.credits.feature.settings", PlayerSettingsManager.class), + SHOPS(OMCRegistry.CUSTOM_ITEMS.get("omc_company:caisse").get(), "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/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..5f886e7f4 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/commands/ShopCommand.java @@ -0,0 +1,36 @@ +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.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.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("create") + @Description("Create a shop") + public void createShop(Player player) { + 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..5f8dbd4ae --- /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 fr.openmc.core.utils.text.messages.TranslationManager; +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, TranslationManager.translation("feature.shop.player.is_not_him_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, TranslationManager.translation("feature.shop.error.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, TranslationManager.translation("feature.shop.error.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..c70daed7f --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/PlayerShopManager.java @@ -0,0 +1,153 @@ +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.text.messages.TranslationManager; +import fr.openmc.core.utils.world.WorldUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +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, TranslationManager.translation("feature.shop.player.not_enough_money", Component.text("500 " + EconomyManager.getEconomyIcon()).color(NamedTextColor.RED)), Prefix.SHOP, MessageType.ERROR, true); + return; + } + + ItemInteraction.runLocationInteraction( + player, + new ItemStack(Material.BARREL), + "shops:shop_creator", + 300, + TranslationManager.translation("feature.shop.player.creating_begin"), + TranslationManager.translation("feature.shop.player.creating_cancel"), + location -> { + if (location == null) return false; + return createShop(player, location); + }, + () -> { + EconomyManager.addBalance(player.getUniqueId(), 500, "Canceling shop creation"); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.cancelling_pay", Component.text("500 " + EconomyManager.getEconomyIcon()).color(NamedTextColor.GREEN)), 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, TranslationManager.translation("feature.shop.player.cant_create_barrel"), Prefix.SHOP, MessageType.ERROR, true); + return false; + } + + if (cashBlock.getType() != Material.AIR) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.cant_create_cash"), 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, TranslationManager.translation("feature.shop.error.cannot_save_location"), 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, TranslationManager.translation("feature.shop.error.cannot_delete"), Prefix.SHOP, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.error.pay_back", Component.text("500 " + EconomyManager.getEconomyIcon()).color(NamedTextColor.GOLD)), Prefix.SHOP, MessageType.INFO, true); + } + else { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.success_created"), Prefix.SHOP, MessageType.SUCCESS, true); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.withdraw_money", Component.text("500 " + EconomyManager.getEconomyIcon()).color(NamedTextColor.RED)), Prefix.SHOP, MessageType.SUCCESS, false); + } + }); + return true; + } else { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.error.multiblock"), 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, TranslationManager.translation("feature.shop.error.not_found"), Prefix.SHOP, MessageType.WARNING, false); + return; + } + + if (shop.getItem() != null && shop.getItem().getAmount() > 0) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.is_not_empty"), Prefix.SHOP, MessageType.WARNING, false); + return; + } + + if (!ShopManager.removeShop(shop)) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.error.cannot_delete"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { + if (!ShopDatabaseManager.deleteDBShop(shop)) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.error.cannot_remove_furniture"), Prefix.SHOP, MessageType.ERROR, false); + OMCLogger.error("Error when " + player.getName() + " trying to delete his shop!"); + } + }); + + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.deleted"), Prefix.SHOP, MessageType.SUCCESS, false); + + EconomyManager.addBalance(player.getUniqueId(), 400); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.player.pay_back", Component.text("400 " + EconomyManager.getEconomyIcon()).color(NamedTextColor.GREEN)), 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..0bb82ba1d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/ShopDatabaseManager.java @@ -0,0 +1,145 @@ +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 fr.openmc.core.features.shops.models.ShopSale; +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; + private static Dao shopSaleDao; + + /** + * Init the Database of the shops + * + * @param connectionSource the connection the to DB + * @throws SQLException if init failed + */ + 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); + + TableUtils.createTableIfNotExists(connectionSource, ShopSale.class); + shopSaleDao = DaoManager.createDao(connectionSource, ShopSale.class); + } + + /** + * Queries shops from DB + * + * @return the map of each shop and it location + * @throws SQLException if query failed + */ + 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; + } + + /** + * Queries shop items from DB + * + * @throws SQLException if query failed + */ + public static void loadDBShopItems() throws SQLException { + List shopItems = shopItemDao.queryForAll(); + for (ShopItem item : shopItems) { + Shop shop = item.getShop(); + if (shop == null) { + OMCLogger.error("Shop for item with shopUUID " + item.getShopUUID() + " is null, item not assigned"); + continue; + } + shop.setItem(item.deserialize()); + } + } + + /** + * Queries shop sales from DB + * + * @throws SQLException if query failed + */ + public static void loadDBShopSales() throws SQLException { + List shopSales = shopSaleDao.queryForAll(); + for (ShopSale sale : shopSales) { + Shop shop = sale.getShop(); + if (shop == null) { + OMCLogger.error("Shop for sale with shopUUID " + sale.getShopUUID() + " is null, sale not assigned"); + continue; + } + shop.registerSale(sale.registerVariables()); + } + } + + /** + * Saves a shop in DB + * + * @param shop the shop to save + * @return true if the shop was saved, false otherwise + */ + 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.getMessage()); + return false; + } + } + + public static boolean saveDBShopItem(ShopItem item) { + try { + shopItemDao.createOrUpdate(item.serialize()); + return true; + } catch (SQLException e) { + OMCLogger.error("Failed to save shop item for owner UUID: {}\nCause: {}", item.getShop().getOwnerUUID(), e.getMessage()); + return false; + } + } + + public static boolean saveDBShopSale(ShopSale sale) { + try { + shopSaleDao.createOrUpdate(sale); + return true; + } catch (SQLException e) { + OMCLogger.error("Failed to save shop sale for owner UUID: {}\nCause: {}", sale.getShop().getOwnerUUID(), e.getMessage()); + 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.getMessage()); + 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..1b594fd1c --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/manager/ShopManager.java @@ -0,0 +1,277 @@ +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()); + } + + /** + * Load shops in the map from DB + * + * @return true if shop are successfully loaded, false otherwise + */ + public static boolean loadShops() { + if (shopsByLocation != null) shopsByLocation.clear(); + try { + shopsByLocation = ShopDatabaseManager.loadDBShops(); + } catch (SQLException e) { + OMCLogger.error("Cannot save shops from database:\n" + e.getMessage()); + return false; + } + + shopsByLocation.values().forEach(shop -> setUUIDShop(shop.getShopUUID(), shop)); + OMCLogger.info("Successfully loaded {} shops from database.", shops.size()); + return true; + } + + /** + * Load shops items from DB + * + * @return true if shop are successfully loaded, false otherwise + */ + 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:\n" + e.getMessage()); + return false; + } + } + + /** + * Save shops to DB + * + * @return true if shop are successfully saved, false otherwise + */ + public static boolean saveShops() { + for (Shop shop : shops.values()) { + if (!ShopDatabaseManager.saveDBShop(shop)) { + OMCLogger.error("Failed to save " + shop.getName() + " to database."); + } + } + return true; + } + + /** + * Save shops items to DB + * + * @return true if shop are successfully saved, false otherwise + */ + 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; + } + + /** + * Verifies if the player is the owner of the shop + * + * @param player the player to verify + * @param shop the shop to verify + * @return true if the player is the owner of the shop, false otherwise + */ + public static boolean isShopOwner(Player player, Shop shop) { + return isShopOwner(player.getUniqueId(), shop); + } + + /** + * Verifies if the player is the owner of the shop + * + * @param playerUUID the uuid of the player to verify + * @param shop the shop to verify + * @return true if the player is the owner of the shop, false otherwise + */ + 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..89efdfa24 --- /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.ItemMenuBuilder; +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..959fda529 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopMenu.java @@ -0,0 +1,200 @@ +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.ItemMenuBuilder; +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 fr.openmc.core.utils.text.messages.TranslationManager; +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.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 TranslationManager.translation("feature.shop.menu.main.title", this.shop.getOwner().name()); + } + + @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 ItemMenuBuilder(this, Material.RED_DYE, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.delete.btn.title")); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.delete.btn.lore1"), + TranslationManager.translation("feature.shop.menu.main.delete.btn.lore2") + )); + }).setOnClick(_ -> new ConfirmMenu( + getOwner(), + () -> { + getOwner().closeInventory(); + PlayerShopManager.deleteShop(getOwner(), shop); + }, + () -> new ShopMenu(getOwner(), shop).open(), + List.of(TranslationManager.translation("feature.shop.menu.main.delete.confirm.accept")), + List.of(TranslationManager.translation("feature.shop.menu.main.delete.confirm.refuse")) + ).open())); + + map.put(3, new ItemMenuBuilder(this, Material.PAPER, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.sells.title")); + if (this.item == null) itemMeta.lore(List.of(TranslationManager.translation("feature.shop.menu.main.stats.lore"))); + }).setOnClick(_ -> { + if (this.item != null) new ShopSalesMenu(getOwner(), this.shop).open(); + })); + + map.put(4, new ItemMenuBuilder(this, Material.GOLD_INGOT, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.stats.title")); + if (this.item == null) itemMeta.lore(List.of(TranslationManager.translation("feature.shop.menu.main.stats.lore"))); + }).setOnClick(_ -> { + if (this.item != null) new ShopStatsMenu(getOwner(), this.shop).open(); + })); + + map.put(5, new ItemMenuBuilder(this, Material.BARREL, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.stocks.title")); + if (this.item == null) itemMeta.lore(List.of(TranslationManager.translation("feature.shop.menu.main.stocks.lore"))); + }).setOnClick(_ -> { + if (this.item != null) new ShopStocksMenu(getOwner(), shop).open(); + })); + + map.put(8, new ItemMenuBuilder(this, Material.GREEN_BANNER, itemMeta -> itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.yours")))); + } + + map.put(isShopOwner ? 19 : 10, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.BTN_64.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.remove.title", Component.text(64).color(NamedTextColor.RED))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.remove.lore", Component.text(64).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> removeAmount(64))); + map.put(isShopOwner ? 20 : 11, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.BTN_10.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.remove.title", Component.text(10).color(NamedTextColor.RED))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.remove.lore", Component.text(10).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> removeAmount(10))); + map.put(isShopOwner ? 21 : 12, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.MINUS_BTN.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.remove.title", Component.text(1).color(NamedTextColor.RED))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.remove.lore", Component.text(1).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> removeAmount(1))); + + map.put(isShopOwner ? 23 : 14, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.PLUS_BTN.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.add.title", Component.text(1).color(NamedTextColor.GREEN))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.add.lore", Component.text(1).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> addAmount(1))); + map.put(isShopOwner ? 24 : 15, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.BTN_10.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.add.title", Component.text(10).color(NamedTextColor.GREEN))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.add.lore", Component.text(10).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> addAmount(10))); + map.put(isShopOwner ? 25 : 16, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.BTN_64.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.add.title", Component.text(64).color(NamedTextColor.GREEN))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.add.lore", Component.text(64).color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD)) + )); + }).setOnClick(_ -> addAmount(64))); + + map.put(22, new ItemMenuBuilder(this, this.item.getItemStack().asOne())); + map.put(isShopOwner ? 30 : 21, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.REFUSE_BTN.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.refuse.title")); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.refuse.lore1", Component.text(this.amountToBuy).color(NamedTextColor.GOLD)), + TranslationManager.translation("feature.shop.menu.main.refuse.lore2") + )); + }).setCloseButton()); + map.put(isShopOwner ? 32 : 23, new ItemMenuBuilder(this, OMCRegistry.CUSTOM_ITEMS.ACCEPT_BTN.getBest(), itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.main.accept.title")); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.main.accept.lore1", Component.text(this.item.getPrice(this.amountToBuy) + " " + EconomyManager.getEconomyIcon()).color(NamedTextColor.GOLD), Component.text(this.amountToBuy).color(NamedTextColor.GOLD)), + TranslationManager.translation("feature.shop.menu.main.accept.lore2") + )); + }).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..50fcf35b0 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopSalesMenu.java @@ -0,0 +1,116 @@ +package fr.openmc.core.features.shops.menu; + +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.template.ItemMenuTemplate; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemMenuBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.features.shops.models.ShopSale; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +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.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ShopSalesMenu extends PaginatedMenu { + + private final Shop shop; + + public ShopSalesMenu(Player owner, Shop shop) { + super(owner); + this.shop = shop; + } + + @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<>(); + List sales = this.shop.getSales(); + sales.forEach(s -> { + ItemStack item = s.getItem().getItemStack(); + item.editMeta(itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.sales.item.name", Component.text(s.getBuyer().getName()).color(NamedTextColor.GOLD))); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.sales.item.lore1", Component.text(s.getDate().toLocalDateTime().format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM))).color(NamedTextColor.LIGHT_PURPLE)), + TranslationManager.translation("feature.shop.menu.sales.item.lore2", Component.text(s.getAmount()).color(NamedTextColor.AQUA), Component.text(s.getPrice() + " " + EconomyManager.getEconomyIcon()).color(NamedTextColor.AQUA)) + )); + }); + items.add(item); + }); + return items; + } + + @Override + public Map getButtons() { + Map map = new HashMap<>(); + map.put(45, ItemMenuTemplate.BTN_CANCEL.apply(this).setOnClick(_ -> new ShopMenu(getOwner(), shop).open())); + map.put(48, ItemMenuTemplate.BTN_PREVIOUS_PAGE_ORANGE.apply(this)); + map.put(49, new ItemMenuBuilder(this, Material.GOLD_BLOCK, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.sales.get_turnover.name")); + itemMeta.lore(List.of( + TranslationManager.translation("feature.shop.menu.sales.get_turnover.lore1", Component.text(this.shop.getTurnover() * 0.8 + " " + EconomyManager.getEconomyIcon()).color(NamedTextColor.LIGHT_PURPLE)), + TranslationManager.translation("feature.shop.menu.sales.get_turnover.lore2") + )); + }).setOnClick(_ -> this.shop.withdrawTurnover())); + map.put(50, ItemMenuTemplate.BTN_NEXT_PAGE_ORANGE.apply(this)); + return map; + } + + @Override + public @NotNull Component getName() { + return TranslationManager.translation("feature.shop.menu.sales.title"); + } + + @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..f15ab257d --- /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.ItemMenuBuilder; +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..7e4e2e932 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopSellingMenu.java @@ -0,0 +1,99 @@ +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.ItemMenuBuilder; +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 fr.openmc.core.utils.text.messages.TranslationManager; +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 TranslationManager.translation("feature.shop.menu.selling.title"); + } + + @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 ItemMenuBuilder(this, item, itemMeta -> { + if (itemMeta.hasLore()) itemMeta.lore().add(TranslationManager.translation("feature.shop.menu.selling.item_lore")); + else itemMeta.lore(List.of(TranslationManager.translation("feature.shop.menu.selling.item_lore"))); + }).setOnClick(_ -> DialogInput.send(getOwner(), + TranslationManager.translation("feature.shop.menu.selling.price_input"), + 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(), TranslationManager.translation("feature.shop.menu.selling.added_item"), 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..928ad800d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/menu/ShopStatsMenu.java @@ -0,0 +1,87 @@ +package fr.openmc.core.features.shops.menu; + +import fr.openmc.api.menulib.Menu; +import fr.openmc.api.menulib.template.ItemMenuTemplate; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemMenuBuilder; +import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.shops.models.Shop; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +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().forEach(s -> { + totalSoldItems += s.getAmount(); + totalUniquePlayers.add(s.getBuyerUUID()); + }); + } + } + + @Override + public @NotNull Component getName() { + return TranslationManager.translation("feature.shop.menu.stats.title"); + } + + @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 ItemMenuBuilder(this, Material.PAPER, itemMeta -> + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stats.sells.title", Component.text(this.shop.getSales().size()).color(NamedTextColor.GREEN))))); + map.put(12, new ItemMenuBuilder(this, Material.GOLD_INGOT, itemMeta -> + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stats.sales.title", Component.text(this.totalSoldItems).color(NamedTextColor.DARK_GREEN))))); + map.put(13, new ItemMenuBuilder(this, Material.GOLD_BLOCK, itemMeta -> + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stats.turnover.title", Component.text(this.shop.getTurnover() + " " + EconomyManager.getEconomyIcon()).color(NamedTextColor.GOLD))))); + map.put(14, new ItemMenuBuilder(this, Material.PLAYER_HEAD, itemMeta -> + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stats.buyers.title", Component.text(this.totalUniquePlayers.size()).color(NamedTextColor.LIGHT_PURPLE))))); + map.put(15, new ItemMenuBuilder(this, Material.BARREL, itemMeta -> + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stats.stocks.title", Component.text(this.shop.getItem().getAmount()).color(NamedTextColor.AQUA))))); + + map.put(18, ItemMenuTemplate.BTN_CANCEL.apply(this).setOnClick(_ -> 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..919fa5793 --- /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.template.ItemMenuTemplate; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemMenuBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +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 fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +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, ItemMenuTemplate.BTN_CANCEL.apply(this).setOnClick(_ -> new ShopMenu(getOwner(), shop).open())); + map.put(49, new ItemMenuBuilder(this, Material.BARREL, itemMeta -> { + itemMeta.displayName(TranslationManager.translation("feature.shop.menu.stocks.fill.name", Component.text(barrelStocks).color(NamedTextColor.GREEN))); + }).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(), TranslationManager.translation("feature.shop.menu.stocks.fill.success"), Prefix.SHOP, MessageType.SUCCESS, true); + new ShopStocksMenu(getOwner(), shop).open(); + })); + + return map; + } + + @Override + public @NotNull Component getName() { + return TranslationManager.translation("feature.shop.menu.stocks.title"); + } + + @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..6b31518d9 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/Shop.java @@ -0,0 +1,184 @@ +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.ItemMenuBuilder; +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 fr.openmc.core.utils.text.messages.TranslationManager; +import lombok.Getter; +import lombok.Setter; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@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 List sales = new ArrayList<>(); + + 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.add(new ShopSale(this.shopUUID, player.getUniqueId(), item)); + } + + public void registerSale(ShopSale sale) { + ShopItem item = sale.getShop().getItem().setAmount(sale.getAmount()); + this.sales.add(sale); + } + + public void addTurnover(double amount) { + this.turnover += amount; + } + + public void withdrawTurnover() { + Player player = CacheOfflinePlayer.getOfflinePlayer(getOwnerUUID()).getPlayer(); + if (player == null) return; + if (!isOwner(player)) return; + if (getTurnover() <= 0) return; + double tempTurnover = getTurnover(); + EconomyManager.addBalance(player.getUniqueId(), tempTurnover * 0.8, "turnover"); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.get_turnover", Component.text(tempTurnover + " " + EconomyManager.getEconomyIcon())), Prefix.SHOP, MessageType.SUCCESS, false); + setTurnover(0); + } + + public void buy(Player player, int amount) { + if (isOwner(player)) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.is_owner"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + if (this.item.getAmount() < amount) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.not_enough_items"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + if (!ItemUtils.hasEnoughSpace(player, item.getItemStack(), amount)) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.not_enough_space"), Prefix.SHOP, MessageType.ERROR, false); + return; + } + double totalPrice = this.item.getPrice(amount); + if (!EconomyManager.withdrawBalance(player.getUniqueId(), totalPrice, getName() + " buying")) { + MessagesManager.sendMessage(player, TranslationManager.translation("feature.shop.not_enough_money"), 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 ItemMenuBuilder getIcon(Menu menu, boolean fromShopMenu) { + return new ItemMenuBuilder(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")); //TODO a voir si on garde + 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..982c4f726 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/ShopItem.java @@ -0,0 +1,101 @@ +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); + } + + public ShopItem serialize() { + this.itemBytes = this.itemStack.serializeAsBytes(); + return this; + } + + public ShopItem deserialize() { + this.itemStack = ItemStack.deserializeBytes(this.itemBytes); + return this; + } +} 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..f1832604f --- /dev/null +++ b/src/main/java/fr/openmc/core/features/shops/models/ShopSale.java @@ -0,0 +1,61 @@ +package fr.openmc.core.features.shops.models; + +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.cache.CacheOfflinePlayer; +import lombok.Getter; +import org.bukkit.entity.Player; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@DatabaseTable(tableName = "shop_sales") +public class ShopSale { + @DatabaseField(canBeNull = false, id = true, columnName = "sale_uuid") + private UUID saleUUID; + @DatabaseField(canBeNull = false, columnName = "shop_uuid") + private UUID shopUUID; + @DatabaseField(canBeNull = false, columnName = "player_uuid") + private UUID buyerUUID; + @DatabaseField(canBeNull = false) + private Timestamp date; + @DatabaseField(canBeNull = false) + private double price; + @DatabaseField(canBeNull = false) + private int amount; + + private Player buyer; + private ShopItem item; + + ShopSale() { + // required for ORMLite + } + + public ShopSale(UUID shopUUID, UUID buyerUUID, double price, int amount, Timestamp date) { + this.saleUUID = UUID.randomUUID(); + this.shopUUID = shopUUID; + this.buyerUUID = buyerUUID; + this.price = price; + this.amount = amount; + this.date = date; + + registerVariables(); + } + + public ShopSale(UUID shopUUID, UUID buyerUUID, ShopItem item) { + this(shopUUID, buyerUUID, item.getPrice(), item.getAmount(), Timestamp.valueOf(LocalDateTime.now())); + } + + public Shop getShop() { + return ShopManager.getShopByUUID(this.shopUUID); + } + + public ShopSale registerVariables() { + if (this.buyer == null) this.buyer = CacheOfflinePlayer.getOfflinePlayer(this.buyerUUID).getPlayer(); + if (this.item == null) this.item = getShop().getItem().setAmount(this.amount); + return this; + } +} 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 a3565f424..8f90e1ace 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; import java.util.Optional; @@ -30,7 +31,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 84dd8d737..bacaff60f 100644 --- a/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java +++ b/src/main/java/fr/openmc/core/registry/items/CustomItemRegistry.java @@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -140,7 +141,7 @@ public CustomItem getOrThrow(ItemStack stack) { public CustomItem register(String name, ItemStack item) { return register(name, new CustomItem(name) { @Override - public ItemStack getVanilla() { + public @NotNull ItemStack getVanilla() { return item; } }); @@ -153,7 +154,7 @@ public CustomItem register(String name, Material item) { public CustomItem register(String name, Material material, String displayName) { return 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 9b6a789f8..73f054574 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,18 +16,19 @@ 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 @@ -35,12 +36,12 @@ feature.credits.feature.versionning=Le Versionning feature.credits.feature.omcregistry=Les Registres OMC feature.credits.feature.customitems=Les Custom Items feature.credits.feature.customlootbox=Les Custom Lootbox -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/main.properties b/src/main/resources/translations/default/main.properties index c18968f81..a2a5fae02 100644 --- a/src/main/resources/translations/default/main.properties +++ b/src/main/resources/translations/default/main.properties @@ -1,6 +1,6 @@ # Language file for the plugin # Native language: French -# Do not use color codes in this file if there is an agument +# Do not use color codes in this file if there is an argument # ** MESSAGES ** messages.global.cannot_do_this=Vous n'avez pas le droit de faire ceci. diff --git a/src/main/resources/translations/default/shop.properties b/src/main/resources/translations/default/shop.properties new file mode 100644 index 000000000..a03eb39b7 --- /dev/null +++ b/src/main/resources/translations/default/shop.properties @@ -0,0 +1,99 @@ +# ** SHOPS ** +# * COMMANDS +# - Global Player Messages +feature.shop.player_has_no_shop=Vous n'avez pas de shop. +feature.shop.player.is_not_him_shop=Ceci n'est pas votre shop. +feature.shop.player.is_not_empty=Votre shop n'est pas vide + +# - Admin Commands +#feature.shop.admin.target_has_no_shop=Ce joueur n'a pas de shop, ou n'a pas été trouvé. +#feature.shop.admin.cannot_place_multiblock=Impossible de poser le multiblock car un des block n'est pas valide. +#feature.shop.admin.multiblock_associated=Multiblock associé au shop. +#feature.shop.admin.barrel_already_associated=Ce barrel est déjà associé au shop. +#feature.shop.admin.no_barrel_detected=Aucun barrel détecté. +#feature.shop.admin.barrel_associated=Barrel associé au shop. +#feature.shop.admin.cash_already_associated=Ce cash est déjà associé au shop. +#feature.shop.admin.no_cash_detected=Aucun cash détecté. +#feature.shop.admin.cash_associated=Cash associé au shop. + +# - Player Commands +feature.shop.player.not_enough_money=Vous n'avez pas assez d'argent pour créer un shop (%1$s nécessaires). +feature.shop.player.creating_begin=Vous avez recu un tonneau pour poser votre shop. +feature.shop.player.creating_cancel=Création de shop annulée. +feature.shop.player.cancelling_pay=Vous avez été remboursé de %1$s pour l'annulation de la création de votre shop. +feature.shop.player.cant_create_barrel=Impossible de créer un shop ici, l'espace du tonneau doit être libre. +feature.shop.player.cant_create_cash=Impossible de créer un shop ici, l'espace au dessus du tonneau doit être libre. +feature.shop.player.deleted=Votre shop a bien été supprimé ! +feature.shop.player.success_created=Votre shop a été créé avec succès ! Vous pouvez maintenant y ajouter des articles. +feature.shop.player.withdraw_money=%1$s retirés de votre compte personnel. +feature.shop.player.pay_back=%1$s remboursés sur votre compte personnel + +# ERRORS +feature.shop.error.shop_is_null=Erreur lors de l'ouverture du shop (le shop est nul) : appelez un admin. +feature.shop.error.entity_is_null=Erreur lors de l'ouverture du shop (l'entité est nulle) : appelez un admin. +feature.shop.error.cannot_save_location=Erreur lors de la création du shop (impossible de sauvegarder la position du shop) : tentative de suppression du shop. Appelez un admin +feature.shop.error.cannot_delete=Impossible de supprimer le shop : appelez un admin +feature.shop.error.cannot_remove_furniture=Erreur lors de la suppression du shop (impossible de retirer le meuble) : appelez un admin +feature.shop.error.not_found=Shop introuvable +feature.shop.error.pay_back=La création de shop n'ayant pas été possible, %1$s vous ont été remboursés +feature.shop.error.multiblock=Erreur lors de la création du shop (multiblock est nul) : appelez un admin + +# * SHOP +feature.shop.get_turnover=Vous avez récupéré %1$s de votre shop. +feature.shop.is_owner=Vous ne pouvez pas acheter des items à votre propre shop. +feature.shop.not_enough_items=Le nombre d'items achetés dépasse le nombre d'items disponibles dans le shop +feature.shop.not_enough_space=Vous n'avez pas assez de place dans votre inventaire pour acheter ce nombre d'items +feature.shop.not_enough_money=Vous n'avez pas assez d'argent pour acheter ce nombre d'items + +# * MENUS +# - Main Shop Menu +feature.shop.menu.main.title=Menu du shop de %1$s +feature.shop.menu.main.delete.btn.title=Supprimer le shop +feature.shop.menu.main.delete.btn.lore1=Retirer tout l'argent et les items est nécessaire pour supprimer le shop. +feature.shop.menu.main.delete.btn.lore2=ATTENTION, IL SERA IMPOSSIBLE DE REVENIR EN ARRIÈRE ! +feature.shop.menu.main.delete.confirm.accept=Supprimer DÉFINITIVEMENT le shop. +feature.shop.menu.main.delete.confirm.refuse=Revenir dans le menu du shop +feature.shop.menu.main.sells.title=Accéder aux ventes du shop +feature.shop.menu.main.stats.title=Accéder aux statistiques du shop +feature.shop.menu.main.stats.lore=Aucune statistique disponible, car aucun item n'est en vente +feature.shop.menu.main.stocks.title=Accéder aux stocks du shop +feature.shop.menu.main.stocks.lore=Impossible d'accéder aux stocks, car aucun item n'est en vente. +feature.shop.menu.main.remove.title=Retiter %1$s +feature.shop.menu.main.remove.lore=CLIQUEZ ICI POUR RETIRER %1$s +feature.shop.menu.main.add.title=Ajouter %1$s +feature.shop.menu.main.add.lore=CLIQUEZ ICI POUR AJOUTER %1$s +feature.shop.menu.main.refuse.title=Refuser l'achat +feature.shop.menu.main.refuse.lore1=Vous refusez d'acheter %1$s item(s) +feature.shop.menu.main.refuse.lore2=CLIQUEZ ICI POUR REFUSER L'ACHAT +feature.shop.menu.main.accept.title=Accepter l'achat +feature.shop.menu.main.accept.lore1=Cela vous coûtera %1$s pour %2$s item(s) +feature.shop.menu.main.accept.lore2=CLIQUEZ ICI POUR ACCEPTER L'ACHAT +feature.shop.menu.main.yours=Ce shop est le votre. + +# - Selling Menu +feature.shop.menu.selling.title=Menu de vente +feature.shop.menu.selling.item_lore=CLIQUEZ ICI POUR SELECTIONNER CET ITEM À VENDRE +feature.shop.menu.selling.price_input=Entrez le prix auquel vous voulez vendre votre item : +feature.shop.menu.selling.added_item=Item ajouté au shop. + +# - Stats Menu +feature.shop.menu.stats.title=Statistiques +feature.shop.menu.stats.sells.title=Total des ventes : %1$s +feature.shop.menu.stats.sales.title=Total d'items vendus : %1$s +feature.shop.menu.stats.turnover.title=Chiffre d'affaires : %1$s +feature.shop.menu.stats.buyers.title=Total d'acheteurs uniques : %1$s +feature.shop.menu.stats.stocks.title=Items restants dans les stocks : %1$s + +# - Sales Menu +feature.shop.menu.sales.title=Ventes du shop +feature.shop.menu.sales.item.name=Achat de %1$s +feature.shop.menu.sales.item.lore1=le %1$s +feature.shop.menu.sales.item.lore2=%1$s item(s) acheté(s) pour %2$s +feature.shop.menu.sales.get_turnover.name=Récupérer les bénéfices +feature.shop.menu.sales.get_turnover.lore1=%1$s à récupérer dans le shop (Hors taxes). +feature.shop.menu.sales.get_turnover.lore2=La TVA est de 20% + +# - Stocks Menu +feature.shop.menu.stocks.title=Menu des Stocks +feature.shop.menu.stocks.fill.name=Remplir depuis le tonneau (%1$s item(s) disponible(s)) +feature.shop.menu.stocks.fill.success=Stocks rechargés.