diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 3d295a2..96a12f4 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -54,8 +54,8 @@ public final class EcoCraftCore extends JavaPlugin { } private void prepareDatabase() throws SQLException { - String databaseUrl = "jdbc:mysql://soukup.xyz:3306/ecc"; - connectionSource = new JdbcConnectionSource(databaseUrl, "ecc", "ecc"); + String databaseUrl = "jdbc:mysql://localhost:3306/ecc"; + connectionSource = new JdbcConnectionSource(databaseUrl, "ecc", ""); Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java index 0ad0d98..884e0c9 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/commands/TransactionCommand.java @@ -27,14 +27,9 @@ public class TransactionCommand { String receiver = StringArgumentType.getString(ctx, "receiver"); double amount = DoubleArgumentType.getDouble(ctx, "amount"); - try { - Dao dao = DaoManager.createDao(EcoCraftCore.connectionSource, Transaction.class); - Transaction tx = new Transaction(amount, "player", sender, "player", receiver, "command"); - dao.create(tx); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } + + Transaction tx = new Transaction(amount, "player", sender, "player", receiver, "command"); + tx.save(); return 1; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java b/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java index 4d691b3..5f12edd 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/events/RulerMarking.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import xyz.soukup.ecoCraftCore.utilities.PDC; @@ -25,7 +26,9 @@ public class RulerMarking implements Listener { ItemStack itemStack = event.getItem(); Block block = event.getClickedBlock(); + Player player = event.getPlayer(); + if(event.getHand() != EquipmentSlot.HAND) return; if (itemStack == null || block == null){ return; @@ -40,26 +43,44 @@ public class RulerMarking implements Listener { event.setCancelled(true); if (block.getState() instanceof Chest chest){ - chests.put(event.getPlayer(), chest); - event.getPlayer().sendMessage("pozice truhly nastavena"); + Chest storedChest = chests.get(player); + if (storedChest != null && storedChest.equals(chest)){ + return; + } + chests.put(player, chest); + player.sendMessage("pozice truhly nastavena"); return; } if (block.getState() instanceof Sign sign){ - signs.put(event.getPlayer(), sign); - event.getPlayer().sendMessage("pozice cedule nastavena"); + Sign storeSign = signs.get(player); + if (storeSign != null && storeSign.equals(sign)){ + return; + } + signs.put(player, sign); + player.sendMessage("pozice cedule nastavena"); return; } + Location location = block.getLocation(); + switch (event.getAction()){ case LEFT_CLICK_BLOCK -> { - primaryLocations.put(event.getPlayer(), block.getLocation()); - event.getPlayer().sendMessage("první pozice nastavena"); + Location storedLocation = primaryLocations.get(player); + if (storedLocation != null && storedLocation.equals(location)){ + return; + } + primaryLocations.put(player, location); + player.sendMessage("první pozice nastavena"); return; } case RIGHT_CLICK_BLOCK -> { - secondaryLocations.put(event.getPlayer(), block.getLocation()); - event.getPlayer().sendMessage("druhá pozice nastavena"); + Location storedLocation = secondaryLocations.get(player); + if (storedLocation != null && storedLocation.equals(location)){ + return; + } + secondaryLocations.put(player, location); + player.sendMessage("druhá pozice nastavena"); return; } } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java index f7ee0ac..fbe5ef4 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/Shop.java @@ -47,6 +47,9 @@ public class Shop { @DatabaseField(canBeNull = false) private Timestamp created = new Timestamp(System.currentTimeMillis()); + @DatabaseField(columnName = "active_on_server") + private String activeServer; + public Shop() { } @@ -95,6 +98,14 @@ public class Shop { } } + public void save(){ + try { + DaoRegistry.getShopDao().createOrUpdate(this); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + public ItemStack getItemStack() { return JSONConverter.itemStackFromJson(this.itemStackJson); } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java index 8a6a135..865be3c 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/Transaction.java @@ -2,7 +2,9 @@ package xyz.soukup.ecoCraftCore.objects; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import xyz.soukup.ecoCraftCore.utilities.DaoRegistry; +import java.sql.SQLException; import java.sql.Timestamp; @DatabaseTable(tableName = "transactions") @@ -43,6 +45,22 @@ public class Transaction { // ORMLite requires a no-arg constructor } + public void save(){ + try { + DaoRegistry.getTransactionDao().createOrUpdate(this); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static Transaction findById(int id) { + try { + return DaoRegistry.getTransactionDao().queryForId(id); + } catch (SQLException e) { + return null; + } + } + public Transaction(double amount, String senderType, String sender, String receiverType, String receiver, String type) { this.amount = amount; this.senderType = senderType; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java b/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java index 2539c9b..08c20e8 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/objects/VirtualChest.java @@ -3,7 +3,14 @@ package xyz.soukup.ecoCraftCore.objects; import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.bukkit.block.Chest; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import xyz.soukup.ecoCraftCore.utilities.DaoRegistry; +import xyz.soukup.ecoCraftCore.utilities.JSONConverter; + +import java.sql.SQLException; @DatabaseTable(tableName = "virtual_chests") public class VirtualChest { @@ -11,10 +18,55 @@ public class VirtualChest { @DatabaseField(generatedId = true) private long id; - @DatabaseField - private String type; + @DatabaseField(columnName = "inventory") + private String inventoryJson; + + @DatabaseField(columnName = "active_on_server") + private String activeServer; + + @DatabaseField(columnName = "is_opened") + private Boolean isOpened = false; + + private Inventory inventory; + + + public VirtualChest(){ + + } + + public VirtualChest(Chest chest){ + Inventory inventory = chest.getSnapshotInventory(); + this.inventoryJson = JSONConverter.inventoryToJson(inventory); + + } + + public static VirtualChest findById(int id) { + try { + return DaoRegistry.getVirtualChestDao().queryForId(id); + } catch (SQLException e) { + return null; + } + } + + public void save(){ + if (this.inventory != null){ + this.inventoryJson = JSONConverter.inventoryToJson(this.inventory); + } + try { + DaoRegistry.getVirtualChestDao().createOrUpdate(this); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public Inventory getInventory(){ + if (this.inventory == null){ + this.inventory = JSONConverter.inventoryFromJson(this.inventoryJson); + } + return this.inventory; + } + + - @DatabaseField(dataType = DataType.SERIALIZABLE, columnName = "data") - private ItemStack[] itemStacks; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java b/src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java new file mode 100644 index 0000000..a3ab141 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/utilities/InventoryUtils.java @@ -0,0 +1,32 @@ +package xyz.soukup.ecoCraftCore.utilities; + +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class InventoryUtils { + public static Integer getCount(Inventory inventory, ItemStack item){ + int count = 0; + for (ItemStack itemStack : inventory.getContents()){ + if (itemStack != null && itemStack.isSimilar(item)){ + count += itemStack.getAmount(); + } + } + return count; + } + public static Integer getSpaceLeft(Inventory inventory, ItemStack item){ + int count = 0; + int stackSize = item.getMaxStackSize(); + + for (ItemStack itemStack : inventory.getContents()){ + if(itemStack == null){ + count += stackSize; + continue; + } + if (itemStack.isSimilar(item)){ + count += stackSize - itemStack.getAmount(); + } + } + + return count; + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/JSONConverter.java b/src/main/java/xyz/soukup/ecoCraftCore/utilities/JSONConverter.java index df2fad2..62de207 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/JSONConverter.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/utilities/JSONConverter.java @@ -2,18 +2,20 @@ package xyz.soukup.ecoCraftCore.utilities; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.lang.reflect.Type; +import java.util.HashMap; import java.util.Map; - public class JSONConverter { public static String itemStackToJson(ItemStack item) { try { Map map = item.serialize(); - return new Gson().toJson(map); // or use your JSON library of choice + return new Gson().toJson(map); } catch (Exception e) { e.printStackTrace(); return null; @@ -31,6 +33,39 @@ public class JSONConverter { } } + public static String inventoryToJson(Inventory inventory) { + try { + Map map = new HashMap<>(); + map.put("size", inventory.getSize()); + map.put("contents", inventory.getContents()); + return new Gson().toJson(map); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Inventory inventoryFromJson(String json) { + try { + Type type = new TypeToken>() {}.getType(); + Map map = new Gson().fromJson(json, type); + int size = ((Double) map.get("size")).intValue(); + + Object[] contentsArray = ((Object[]) ((Map) map).get("contents")); + ItemStack[] contents = new ItemStack[contentsArray.length]; + for (int i = 0; i < contentsArray.length; i++) { + Map itemMap = (Map) contentsArray[i]; + contents[i] = ItemStack.deserialize(itemMap); + } + Inventory inventory = Bukkit.createInventory(null, size); + inventory.setContents(contents); + + return inventory; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/utilities/PDC.java b/src/main/java/xyz/soukup/ecoCraftCore/utilities/PDC.java index cee927b..0d14c28 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/utilities/PDC.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/utilities/PDC.java @@ -1,6 +1,8 @@ package xyz.soukup.ecoCraftCore.utilities; import org.bukkit.NamespacedKey; +import org.bukkit.block.Chest; +import org.bukkit.block.DoubleChest; import org.bukkit.block.TileState; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -19,8 +21,22 @@ public class PDC { }; public static void set(TileState tileState, String key, Object value, PersistentDataType persistentDataType){ - setUniversal(tileState, key, value, persistentDataType); - tileState.update(); + if (tileState instanceof DoubleChest doubleChest){ + Chest leftSideChest = (Chest) doubleChest.getLeftSide(); + Chest rightSideChest = (Chest) doubleChest.getRightSide(); + + assert leftSideChest != null; + setUniversal(leftSideChest, key, value, persistentDataType); + assert rightSideChest != null; + setUniversal(rightSideChest, key, value, persistentDataType); + + leftSideChest.update(); + rightSideChest.update(); + + }else { + setUniversal(tileState, key, value, persistentDataType); + tileState.update(); + } } public static Integer getInteger(TileState tileState, String key){