- confirm menu
master
jakub 1 month ago
parent d664f51214
commit 4f6bfdf26d
  1. 3
      src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
  2. 2
      src/main/java/xyz/soukup/ecoCraftCore/database/DaoRegistry.java
  3. 18
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java
  4. 47
      src/main/java/xyz/soukup/ecoCraftCore/database/objects/VirtualChest.java
  5. 3
      src/main/java/xyz/soukup/ecoCraftCore/messages/Messages.java
  6. 2
      src/main/java/xyz/soukup/ecoCraftCore/shop/ShopCommand.java
  7. 83
      src/main/java/xyz/soukup/ecoCraftCore/shop/ShopLogic.java
  8. 83
      src/main/java/xyz/soukup/ecoCraftCore/virtualChest/VirtualChestLogic.java
  9. 4
      src/main/resources/messages.yml

@ -6,7 +6,6 @@ import com.infernalsuite.asp.api.AdvancedSlimePaperAPI;
import com.infernalsuite.asp.api.world.SlimeWorldInstance; import com.infernalsuite.asp.api.world.SlimeWorldInstance;
import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.DataSourceConnectionSource; import com.j256.ormlite.jdbc.DataSourceConnectionSource;
import com.j256.ormlite.jdbc.JdbcConnectionSource;
import com.j256.ormlite.stmt.UpdateBuilder; import com.j256.ormlite.stmt.UpdateBuilder;
import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils; import com.j256.ormlite.table.TableUtils;
@ -40,7 +39,7 @@ import xyz.soukup.ecoCraftCore.database.objects.Island;
import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.database.objects.Transaction; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;

@ -2,7 +2,7 @@ package xyz.soukup.ecoCraftCore.database;
import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.Dao;
import xyz.soukup.ecoCraftCore.database.objects.*; import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
public class DaoRegistry { public class DaoRegistry {
private static Dao<Shop, Integer> shopDao; private static Dao<Shop, Integer> shopDao;

@ -102,6 +102,7 @@ public class Shop {
this.stock = stock; this.stock = stock;
} }
public static Shop findById(int id) { public static Shop findById(int id) {
Shop shop = cache.get(id); Shop shop = cache.get(id);
@ -116,6 +117,10 @@ public class Shop {
} }
} }
public static HashMap<Integer, Shop> getCache(){
return cache;
}
public void save(){ public void save(){
try { try {
DaoRegistry.getShopDao().createOrUpdate(this); DaoRegistry.getShopDao().createOrUpdate(this);
@ -126,10 +131,21 @@ public class Shop {
cache.put(this.id, this); cache.put(this.id, this);
} }
public void delete(){
try {
cache.remove(this.id);
DaoRegistry.getShopDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public ItemStack getItemStack() { public ItemStack getItemStack() {
return Converter.itemstackFromString(this.itemStackString); return Converter.itemstackFromString(this.itemStackString);
} }
public void writeIntoSign(Sign sign){ public void writeIntoSign(Sign sign){
PDC.set(sign, "shop", this.id); PDC.set(sign, "shop", this.id);
@ -159,7 +175,7 @@ public class Shop {
} }
public long getId() { public int getId() {
return id; return id;
} }

@ -1,18 +1,22 @@
package xyz.soukup.ecoCraftCore.inventory; package xyz.soukup.ecoCraftCore.database.objects;
import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.table.DatabaseTable; import com.j256.ormlite.table.DatabaseTable;
import org.bukkit.block.Chest; import org.bukkit.block.Chest;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.database.DaoRegistry;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.utilities.Converter; import xyz.soukup.ecoCraftCore.utilities.Converter;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
@DatabaseTable(tableName = "virtual_chests") @DatabaseTable(tableName = "virtual_chests")
public class VirtualChest { public class VirtualChest {
@ -29,7 +33,7 @@ public class VirtualChest {
private Inventory inventory; private Inventory inventory;
private static final HashMap<Integer, VirtualChest> cache = new HashMap<>(); private static final HashMap<Integer, VirtualChest> cache = new HashMap<>();
private static final HashSet<Integer> cacheChanges = new HashSet<>(); private static final HashSet<Integer> changedCached = new HashSet<>();
public VirtualChest(){ public VirtualChest(){
@ -77,7 +81,7 @@ public class VirtualChest {
public static void saveCache(){ public static void saveCache(){
cache.forEach((key, value) -> { cache.forEach((key, value) -> {
if (!cacheChanges.contains(key)) return; if (!changedCached.contains(key)) return;
value.databaseSave(); value.databaseSave();
}); });
@ -87,7 +91,7 @@ public class VirtualChest {
public void save() { public void save() {
cache.put(this.id, this); cache.put(this.id, this);
cacheChanges.add(this.id); changedCached.add(this.id);
} }
public void databaseSave(){ public void databaseSave(){
@ -101,7 +105,40 @@ public class VirtualChest {
} }
cache.put(this.id, this); cache.put(this.id, this);
cacheChanges.remove(this.id); changedCached.remove(this.id);
}
public void delete(){
try {
DaoRegistry.getVirtualChestDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void deleteSelfAndShops(){
QueryBuilder<Shop, Integer> queryBuilder = DaoRegistry.getShopDao().queryBuilder();
DeleteBuilder<Shop, Integer> deleteBuilder = DaoRegistry.getShopDao().deleteBuilder();
try {
queryBuilder
.selectColumns("id")
.where()
.eq("virtualChestID", this.id);
List<Shop> shops = queryBuilder.query();
HashMap<Integer, Shop> cache = Shop.getCache();
for(Shop shop : shops){
cache.remove(shop.getId());
}
deleteBuilder.where().eq("virtualChestID", this.id);
deleteBuilder.delete();
DaoRegistry.getVirtualChestDao().delete(this);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} }
public void setInventory(Inventory inventory) { public void setInventory(Inventory inventory) {

@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
@ -39,7 +40,7 @@ public class Messages {
} }
public static String getAsString(String key){ public static String getAsString(String key){
return MiniMessage.miniMessage().serialize(Messages.get(key)); return LegacyComponentSerializer.legacySection().serialize(Messages.get(key));
} }
public static Component get(String key, HashMap<String, String> placeholders){ public static Component get(String key, HashMap<String, String> placeholders){

@ -11,7 +11,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.inventory.InventoryUtils; import xyz.soukup.ecoCraftCore.inventory.InventoryUtils;
import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;

@ -1,6 +1,8 @@
package xyz.soukup.ecoCraftCore.shop; package xyz.soukup.ecoCraftCore.shop;
import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
import com.github.stefvanschie.inventoryframework.gui.type.HopperGui;
import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
import com.github.stefvanschie.inventoryframework.pane.StaticPane; import com.github.stefvanschie.inventoryframework.pane.StaticPane;
import io.papermc.paper.dialog.Dialog; import io.papermc.paper.dialog.Dialog;
import io.papermc.paper.dialog.DialogResponseView; import io.papermc.paper.dialog.DialogResponseView;
@ -11,13 +13,16 @@ import io.papermc.paper.registry.data.dialog.input.DialogInput;
import io.papermc.paper.registry.data.dialog.type.DialogType; import io.papermc.paper.registry.data.dialog.type.DialogType;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.event.ClickCallback; import net.kyori.adventure.text.event.ClickCallback;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -29,7 +34,7 @@ import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.database.objects.Account; import xyz.soukup.ecoCraftCore.database.objects.Account;
import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.database.objects.Transaction; import xyz.soukup.ecoCraftCore.database.objects.Transaction;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.utilities.*; import xyz.soukup.ecoCraftCore.utilities.*;
import java.util.HashMap; import java.util.HashMap;
@ -87,6 +92,39 @@ public class ShopLogic implements Listener {
gui.show(player); gui.show(player);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onDestroy(BlockBreakEvent event){
if (event.isCancelled()){
return;
}
Block block = event.getBlock();
if (!(block.getState() instanceof Sign sign)){
return;
}
Integer id = PDC.getInteger(sign, "shop");
if (id == null){
return;
}
Shop shop = Shop.findById(id);
if (shop == null){
return;
}
event.setCancelled(true);
Player player = event.getPlayer();
HopperGui gui = confirmBreakGui(block, shop);
gui.show(player);
} }
public static ChestGui buildShopGui(Player player, Shop shop){ public static ChestGui buildShopGui(Player player, Shop shop){
@ -260,7 +298,7 @@ public class ShopLogic implements Listener {
HashMap<String, String> hashMap = new HashMap<>(); HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("count", Integer.toString(amount)); hashMap.put("count", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", price)); hashMap.put("price", String.format("%.2f", price));
hashMap.put("item", itemStack.displayName().toString()); hashMap.put("item", PlainTextComponentSerializer.plainText().serialize(itemStack.displayName()));
Messages.send(player, "shop.buy", hashMap); Messages.send(player, "shop.buy", hashMap);
@ -348,9 +386,48 @@ public class ShopLogic implements Listener {
HashMap<String, String> hashMap = new HashMap<>(); HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("count", Integer.toString(amount)); hashMap.put("count", Integer.toString(amount));
hashMap.put("price", String.format("%.2f", price)); hashMap.put("price", String.format("%.2f", price));
hashMap.put("item", itemStack.displayName().toString()); hashMap.put("item", PlainTextComponentSerializer.plainText().serialize(itemStack.displayName()));
Messages.send(player, "shop.sell", hashMap); Messages.send(player, "shop.sell", hashMap);
} }
public static HopperGui confirmBreakGui(Block block, Shop shop){
HopperGui gui = new HopperGui(Messages.getAsString("menu.destroy-confirmation.title"));
OutlinePane pane = new OutlinePane(0,0, 5, 1);
gui.setOnGlobalClick(inventoryClickEvent -> {
inventoryClickEvent.setCancelled(true);
});
GuiItem confirmButton = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("menu.destroy-confirmation.confirm"))
.build();
GuiItem cancelButton = new GuiItemBuilder(Material.RED_WOOL)
.setName(Messages.get("menu.destroy-confirmation.cancel"))
.build();
cancelButton.setAction(event -> {
event.getClickedInventory().close();
});
confirmButton.setAction(event -> {
destroyShopAndBlock(block, shop);
event.getClickedInventory().close();
});
pane.addItem(confirmButton);
pane.addItem(cancelButton);
gui.getSlotsComponent().addPane(pane);
return gui;
}
private static void destroyShopAndBlock(Block block, Shop shop){
block.breakNaturally();
shop.delete();
}
} }

@ -1,17 +1,24 @@
package xyz.soukup.ecoCraftCore.virtualChest; package xyz.soukup.ecoCraftCore.virtualChest;
import org.bukkit.block.Chest; import com.github.stefvanschie.inventoryframework.gui.GuiItem;
import org.bukkit.block.DoubleChest; import com.github.stefvanschie.inventoryframework.gui.type.HopperGui;
import org.bukkit.block.TileState; import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
import org.bukkit.Material;
import org.bukkit.block.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import xyz.soukup.ecoCraftCore.inventory.VirtualChest; import xyz.soukup.ecoCraftCore.database.objects.Shop;
import xyz.soukup.ecoCraftCore.gui.GuiItemBuilder;
import xyz.soukup.ecoCraftCore.database.objects.VirtualChest;
import xyz.soukup.ecoCraftCore.messages.Messages;
import xyz.soukup.ecoCraftCore.utilities.PDC; import xyz.soukup.ecoCraftCore.utilities.PDC;
import java.util.HashMap; import java.util.HashMap;
@ -20,6 +27,39 @@ public class VirtualChestLogic implements Listener {
public static HashMap<Integer, Integer> openedChests = new HashMap<>(); public static HashMap<Integer, Integer> openedChests = new HashMap<>();
@EventHandler(priority = EventPriority.HIGHEST)
public void blockBreak(BlockBreakEvent event){
Block block = event.getBlock();
BlockState blockState = block.getState();
Player player = event.getPlayer();
Integer id;
if (blockState instanceof Chest chest){
id = PDC.getInteger(chest, "virtual");
} else if (blockState instanceof DoubleChest doubleChest) {
id = PDC.getInteger((TileState) doubleChest.getRightSide(), "virtual");
}else {
return;
}
if (id == null){
return;
}
VirtualChest virtualChest = VirtualChest.findById(id);
if (virtualChest == null){
return;
}
event.setCancelled(true);
HopperGui gui = confirmBreakGui(block, virtualChest);
gui.show(player);
}
@EventHandler @EventHandler
public void chestOpen(InventoryOpenEvent event){ public void chestOpen(InventoryOpenEvent event){
InventoryHolder inventoryHolder = event.getInventory().getHolder(); InventoryHolder inventoryHolder = event.getInventory().getHolder();
@ -143,8 +183,43 @@ public class VirtualChestLogic implements Listener {
virtualChest.save(); virtualChest.save();
}
public static HopperGui confirmBreakGui(Block block, VirtualChest virtualChest){
HopperGui gui = new HopperGui(Messages.getAsString("menu.destroy-confirmation.title"));
OutlinePane pane = new OutlinePane(0,0, 5, 1);
gui.setOnGlobalClick(inventoryClickEvent -> {
inventoryClickEvent.setCancelled(true);
});
GuiItem confirmButton = new GuiItemBuilder(Material.LIME_WOOL)
.setName(Messages.get("menu.destroy-confirmation.confirm"))
.build();
GuiItem cancelButton = new GuiItemBuilder(Material.RED_WOOL)
.setName(Messages.get("menu.destroy-confirmation.cancel"))
.build();
cancelButton.setAction(event -> {
event.getClickedInventory().close();
});
confirmButton.setAction(event -> {
destroyShopAndBlock(block, virtualChest);
event.getClickedInventory().close();
});
pane.addItem(confirmButton);
pane.addItem(cancelButton);
gui.getSlotsComponent().addPane(pane);
return gui;
}
private static void destroyShopAndBlock(Block block, VirtualChest virtualChest){
block.breakNaturally();
virtualChest.deleteSelfAndShops();
} }
} }

@ -50,6 +50,10 @@ marker:
primary: "<green>První pozice označena (<x>,<y>,<z>)" primary: "<green>První pozice označena (<x>,<y>,<z>)"
secondary: "<green>Druhá pozice označena (<x>,<y>,<z>)" secondary: "<green>Druhá pozice označena (<x>,<y>,<z>)"
menu: menu:
destroy-confirmation:
title: "<gold>Zníčit obchod?"
confirm: "<green><bold>Ano."
cancel: "<red><bold>Ne."
island-selector: island-selector:
title: "<green><bold>Výběr ostrovu" title: "<green><bold>Výběr ostrovu"
my-islands: "<yellow><bold>Moje ostrovy" my-islands: "<yellow><bold>Moje ostrovy"

Loading…
Cancel
Save