diff --git a/src/main/java/fr/communaywen/core/teams/Team.java b/src/main/java/fr/communaywen/core/teams/Team.java index bbf63d09..7b73563b 100644 --- a/src/main/java/fr/communaywen/core/teams/Team.java +++ b/src/main/java/fr/communaywen/core/teams/Team.java @@ -3,11 +3,16 @@ import fr.communaywen.core.AywenCraftPlugin; import fr.communaywen.core.teams.utils.MethodState; import fr.communaywen.core.utils.database.DatabaseConnector; +import fr.communaywen.core.utils.serializer.BukkitSerializer; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -17,17 +22,48 @@ import java.sql.SQLException; import java.util.*; -public class Team extends DatabaseConnector { +public class Team extends DatabaseConnector implements Listener{ private UUID owner; private final String name; private final List players = new ArrayList<>(); private final Inventory inventory; - public Team(UUID owner, String name) { + AywenCraftPlugin plugin; + + public Team(UUID owner, String name, AywenCraftPlugin plugin) { + this.plugin = plugin; this.owner = owner; this.name = name; this.inventory = Bukkit.createInventory(null, 27, name + " - Inventory"); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onInventoryOpen(InventoryOpenEvent e) { + Inventory inv = e.getInventory(); + if (inv.equals(inventory)) { + if (inv.getViewers().size() > 1) { + Player other = (Player) inv.getViewers().getFirst(); + e.getPlayer().sendMessage(ChatColor.RED+other.getName()+" est déjà entrain de regarder l'inventaire de team"); + e.getPlayer().closeInventory(); + e.setCancelled(true); + } + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent e) { + if (e.getInventory() == inventory) { + try { + PreparedStatement statement = connection.prepareStatement("UPDATE teams SET inventory = ? WHERE teamName = ?"); + statement.setBytes(1, new BukkitSerializer().serializeItemStacks(inventory.getContents())); + statement.setString(2, name); + statement.executeUpdate(); + } catch (Exception exc) { + plugin.getLogger().severe("Impossible de sauvegarder l'inventaire de la team '"+this.name+"'"); + } + } } public void delete() throws SQLException { @@ -36,34 +72,12 @@ public void delete() throws SQLException { statement.setString(1, this.name); statement.executeUpdate(); - // Remove team from teams + // Delete team from teams statement = connection.prepareStatement("DELETE FROM teams WHERE teamName = ?"); statement.setString(1, this.name); statement.executeUpdate(); } - public void save(){ - try { - delete(); - - for (UUID player : this.getPlayers()){ - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams_player VALUES (?, ?)"); - statement.setString(1, this.name); - statement.setString(2, player.toString()); - statement.executeUpdate(); - } - - PreparedStatement statement = connection.prepareStatement("INSERT INTO teams VALUES (?, ?, 0)"); - statement.setString(1, this.name); - statement.setString(2, this.owner.toString()); - statement.executeUpdate(); - - } catch (SQLException e){ - e.printStackTrace(); - System.out.println("\u001B[31mErreur en sauvegardant la team '"+this.name+"'\u001B[0m"); - } - } - public String getName() { return name; @@ -96,6 +110,12 @@ public void openInventory(Player player) { player.openInventory(inventory); } + public void setInventory(ItemStack[] newinv) { + // Woooooh dangereux + if (newinv == null) { return; } + inventory.setContents(newinv); + } + public void giveClaimStick(Player player) { ItemStack itemStack = new ItemStack(Material.STICK); ItemMeta itemMeta = itemStack.getItemMeta(); @@ -137,7 +157,16 @@ public boolean addPlayer(UUID player) { return false; } players.add(player); - save(); + + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams_player VALUES (?, ?)"); + statement.setString(1, this.name); + statement.setString(2, player.toString()); + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible d'ajouter '"+player.toString()+"' dans '"+this.name+"'"); + } + return true; } @@ -161,7 +190,15 @@ public MethodState removePlayer(UUID player) { if (isOwner(player)) { owner = getRandomPlayer(); } - save(); + + try { + PreparedStatement statement = connection.prepareStatement("DELETE FROM teams_player WHERE player = ?"); + statement.setString(2, player.toString()); + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible de supprimer '"+player.toString()+"' dans '"+this.name+"'"); + } + return MethodState.VALID; } diff --git a/src/main/java/fr/communaywen/core/teams/TeamManager.java b/src/main/java/fr/communaywen/core/teams/TeamManager.java index 95b0a142..a7172f48 100644 --- a/src/main/java/fr/communaywen/core/teams/TeamManager.java +++ b/src/main/java/fr/communaywen/core/teams/TeamManager.java @@ -5,6 +5,7 @@ import fr.communaywen.core.credit.Feature; import fr.communaywen.core.utils.Queue; import fr.communaywen.core.utils.database.DatabaseConnector; +import fr.communaywen.core.utils.serializer.BukkitSerializer; import lombok.Getter; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -21,7 +22,10 @@ public class TeamManager extends DatabaseConnector { // Zeub - By Xernas 05/07/2024 à 00:05 (UTC+2) // Le createur de ce truc + AywenCraftPlugin plugin; + public TeamManager(AywenCraftPlugin plugin) { + this.plugin = plugin; try { ResultSet rs = connection.prepareStatement("SELECT * FROM teams").executeQuery(); @@ -29,10 +33,14 @@ public TeamManager(AywenCraftPlugin plugin) { Team team = createTeam(UUID.fromString(rs.getString("owner")), rs.getString("teamName")); PreparedStatement query = connection.prepareStatement("SELECT * FROM teams_player WHERE teamName = ?"); query.setString(1, rs.getString("teamName")); - ResultSet players = query.executeQuery(); + ItemStack[] newInventory = new BukkitSerializer().deserializeItemStacks(rs.getBytes("inventory")); + if (newInventory != null) { + team.setInventory(newInventory); + } + + ResultSet players = query.executeQuery(); while (players.next()) { - System.out.println("Adding "+players.getString("player")); team.addPlayerWithoutSave(UUID.fromString(players.getString("player"))); } } @@ -51,10 +59,21 @@ public TeamManager(AywenCraftPlugin plugin) { private final Queue pendingInvites = new Queue<>(20); public Team createTeam(UUID owner, String name) { - Team team = new Team(owner, name); + Team team = new Team(owner, name, plugin); if (!teamExists(name)) { teams.add(team); } + + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO teams (teamName, owner, balance) VALUES (?, ?, 0)"); + statement.setString(1, name); + statement.setString(2, owner.toString()); + + statement.executeUpdate(); + } catch (Exception e) { + plugin.getLogger().severe("Impossible de sauvegarder la team '"+name+"'"); + } + return team; } diff --git a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java index c971f4c4..c5ede442 100644 --- a/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/communaywen/core/utils/database/DatabaseManager.java @@ -48,7 +48,7 @@ public void init() throws SQLException { this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS link_verif (minecraft_uuid VARCHAR(36) NOT NULL, code int(11) NOT NULL)").executeUpdate(); this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS events_rewards (player VARCHAR(36) NOT NULL PRIMARY KEY, scope VARCHAR(32) NOT NULL, isClaimed BOOLEAN)").executeUpdate(); this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams_player (teamName VARCHAR(16) NOT NULL, player VARCHAR(36) NOT NULL)").executeUpdate(); - this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams (teamName VARCHAR(16) NOT NULL PRIMARY KEY, owner VARCHAR(36) NOT NULL, balance BIGINT UNSIGNED)").executeUpdate(); + this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS teams (teamName VARCHAR(16) NOT NULL PRIMARY KEY, owner VARCHAR(36) NOT NULL, balance BIGINT UNSIGNED, inventory LONGBLOB)").executeUpdate(); // Système de claims this.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS claim (" +