From b63c130730ba9fa3b47debc9b8d4a965eefc7f0a Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Fri, 21 Jan 2022 17:59:59 -0500 Subject: [PATCH] Off hand works now, and added some database converter stuff --- .../fisher2911/hmccosmetics/HMCCosmetics.java | 3 +- .../hmccosmetics/database/Database.java | 28 ++++- .../database/DatabaseConverter.java | 65 ++++++++++ .../database/DatabaseFactory.java | 10 +- .../hmccosmetics/database/DatabaseType.java | 9 ++ .../hmccosmetics/database/MySQLDatabase.java | 8 +- .../hmccosmetics/database/SQLiteDatabase.java | 8 +- .../hmccosmetics/gui/ArmorItem.java | 1 + .../hmccosmetics/gui/CosmeticGui.java | 27 +++-- .../hmccosmetics/gui/DyeSelectorGui.java | 1 - .../hmccosmetics/listener/ClickListener.java | 69 ++++++++++- .../listener/CosmeticFixListener.java | 45 +++++++ .../listener/HatRemoveFixListener.java | 47 -------- .../listener/RespawnListener.java | 6 +- .../hmccosmetics/user/UserManager.java | 112 +++++++++++------- src/main/resources/database/info.yml | 1 + 16 files changed, 320 insertions(+), 120 deletions(-) create mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseConverter.java create mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseType.java create mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java delete mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java create mode 100644 src/main/resources/database/info.yml diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index 02486613..e01c3e3d 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -20,7 +20,6 @@ import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; -import java.io.BufferedReader; import java.sql.SQLException; import java.util.Arrays; import java.util.HashMap; @@ -80,7 +79,7 @@ public class HMCCosmetics extends JavaPlugin { new ClickListener(this), new TeleportListener(this), new RespawnListener(this), - new HatRemoveFixListener(this) + new CosmeticFixListener(this) ). forEach( listener -> this.getServer().getPluginManager().registerEvents(listener, this) diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java index e5ed9cd4..f089f254 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java @@ -43,17 +43,24 @@ public class Database { protected final HMCCosmetics plugin; private final ConnectionSource dataSource; + private final DatabaseType databaseType; + final Dao userDao; final Dao armorItemDao; - public Database(final HMCCosmetics plugin, final ConnectionSource dataSource) throws SQLException { + public Database( + final HMCCosmetics plugin, + final ConnectionSource dataSource, + final DatabaseType databaseType) throws SQLException { this.plugin = plugin; this.dataSource = dataSource; this.userDao = DaoManager.createDao(this.dataSource, UserDAO.class); this.armorItemDao = DaoManager.createDao(this.dataSource, ArmorItemDAO.class); + this.databaseType = databaseType; } public void load() { + new DatabaseConverter(this.plugin, this).convert(); this.createTables(); } @@ -100,6 +107,7 @@ public class Database { try { final UserDAO userDAO = new UserDAO(user.getUuid()); this.userDao.assignEmptyForeignCollection(userDAO, "armorItems"); + for (final ArmorItem armorItem : user.getPlayerArmor().getArmorItems()) { final ArmorItemDAO dao = ArmorItemDAO.fromArmorItem(armorItem); dao.setUser(userDAO); @@ -124,7 +132,23 @@ public class Database { } } -// public abstract void close(); + protected ConnectionSource getDataSource() { + return dataSource; + } + + public DatabaseType getDatabaseType() { + return databaseType; + } + + public Dao getUserDao() { + return userDao; + } + + public Dao getArmorItemDao() { + return armorItemDao; + } + + // public abstract void close(); // // public abstract String getSaveStatement(); // diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseConverter.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseConverter.java new file mode 100644 index 00000000..6579e39f --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseConverter.java @@ -0,0 +1,65 @@ +package io.github.fisher2911.hmccosmetics.database; + +import io.github.fisher2911.hmccosmetics.HMCCosmetics; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.nio.file.Path; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +public class DatabaseConverter { + + private final HMCCosmetics plugin; + private final Database database; + + public DatabaseConverter(final HMCCosmetics plugin, final Database database) { + this.database = database; + this.plugin = plugin; + } + + private static final String FILE_NAME = "info.yml"; + + public void convert() { + final File folder = new File(this.plugin.getDataFolder(), "database"); + + final File file = Path.of( + folder.getPath(), + FILE_NAME + ).toFile(); + + + if (!file.exists()) { + this.plugin.saveResource("database" + File.separator + FILE_NAME, true); + } + + final int version = YamlConfiguration.loadConfiguration(file).getInt("version"); + + this.convert(version); + } + + private void convert(final int version) { + + } + + private void convertVersionOne() { +// switch (this.database.getDatabaseType()) { +// +// } + final String query = "SELECT * from user"; + try (final PreparedStatement statement = this.database.getDataSource().getReadOnlyConnection("user"). + getUnderlyingConnection().prepareStatement(query)) { + final ResultSet results = statement.executeQuery(); + while (results.next()) { + System.out.println(results.getObject(1, UUID.class)); + System.out.println(results.getString(2)); + System.out.println(results.getString(3)); + System.out.println(results.getInt(4)); + } + } catch (final SQLException exception) { + exception.printStackTrace(); + } + } +} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseFactory.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseFactory.java index 25292f69..58f9a532 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseFactory.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseFactory.java @@ -62,7 +62,11 @@ public class DatabaseFactory { final HikariDataSource source = new HikariDataSource(hikari); - yield new Database(plugin, new DataSourceConnectionSource(source, jdbcUrl)); + yield new Database( + plugin, + new DataSourceConnectionSource(source, jdbcUrl), + DatabaseType.MYSQL + ); } case "sqlite" -> { final File folder = new File(plugin.getDataFolder().getPath(), "database"); @@ -70,7 +74,9 @@ public class DatabaseFactory { yield new Database(plugin, new JdbcPooledConnectionSource("jdbc:sqlite:" + new File( folder.getPath(), "users.db" - ).getPath())); + ).getPath()), + DatabaseType.SQLITE + ); } default -> null; }; diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseType.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseType.java new file mode 100644 index 00000000..1e91aeb0 --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/DatabaseType.java @@ -0,0 +1,9 @@ +package io.github.fisher2911.hmccosmetics.database; + +public enum DatabaseType { + + MYSQL, + + SQLITE + +} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/MySQLDatabase.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/MySQLDatabase.java index 0809da2a..70c3450e 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/database/MySQLDatabase.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/MySQLDatabase.java @@ -1,11 +1,9 @@ package io.github.fisher2911.hmccosmetics.database; import com.j256.ormlite.support.ConnectionSource; -import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import io.github.fisher2911.hmccosmetics.HMCCosmetics; -import java.sql.Connection; import java.sql.SQLException; public class MySQLDatabase extends Database { @@ -34,12 +32,16 @@ public class MySQLDatabase extends Database { private final HikariDataSource dataSource; public MySQLDatabase(final HMCCosmetics plugin, final ConnectionSource dataSource, final String SAVE_STATEMENT, final String LOAD_STATEMENT, final HikariDataSource dataSource1) throws SQLException { - super(plugin, dataSource); + super(plugin, dataSource, DatabaseType.MYSQL); this.SAVE_STATEMENT = SAVE_STATEMENT; this.LOAD_STATEMENT = LOAD_STATEMENT; this.dataSource = dataSource1; } + public void getAll() { + + } + @Override public void close() { this.dataSource.close(); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/SQLiteDatabase.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/SQLiteDatabase.java index 337cc794..de9cd80f 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/database/SQLiteDatabase.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/SQLiteDatabase.java @@ -1,15 +1,9 @@ package io.github.fisher2911.hmccosmetics.database; -import com.j256.ormlite.jdbc.DataSourceConnectionSource; -import com.j256.ormlite.jdbc.JdbcPooledConnectionSource; import com.j256.ormlite.support.ConnectionSource; import io.github.fisher2911.hmccosmetics.HMCCosmetics; -import javax.sql.DataSource; -import java.io.File; -import java.nio.file.Path; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.SQLException; public class SQLiteDatabase extends Database { @@ -17,7 +11,7 @@ public class SQLiteDatabase extends Database { private Connection conn; public SQLiteDatabase(final HMCCosmetics plugin, final ConnectionSource connectionSource) throws SQLException { - super(plugin, connectionSource); + super(plugin, connectionSource, DatabaseType.SQLITE); } String SAVE_STATEMENT = diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/ArmorItem.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/ArmorItem.java index 8c051173..068e814b 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/ArmorItem.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/ArmorItem.java @@ -263,5 +263,6 @@ public class ArmorItem extends GuiItem { BACKPACK, OFF_HAND + } } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java index 4361d329..36efc4d1 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java @@ -67,13 +67,13 @@ public class CosmeticGui { } private void setUserArmor( - final HumanEntity player, + final HumanEntity human, final User user, final ArmorItem armorItem, final InventoryClickEvent event, final GuiAction actionIfSet) { - if (player == null) { + if (!(human instanceof final Player player)) { return; } @@ -82,10 +82,21 @@ public class CosmeticGui { final ArmorItem setTo = this.plugin.getUserManager().setOrUnset( user, armorItem, - Messages.getSetMessage(type), - Messages.getRemovedMessage(type)); - if (setTo.isEmpty()) return; - actionIfSet.execute(event); + Messages.getRemovedMessage(type), + Messages.getSetMessage(type) + ); + + if (!setTo.isEmpty()) { + actionIfSet.execute(event); + } + + final int slot = event.getSlot(); + + final GuiItem guiItem = this.getGuiItem(user, player, slot); + + if (guiItem == null) return; + + this.gui.updateItem(slot, guiItem); } public void open(final HumanEntity humanEntity) { @@ -102,9 +113,7 @@ public class CosmeticGui { rows(this.rows). create(); - this.gui.setDefaultClickAction(event -> { - event.setCancelled(true); - }); + this.gui.setDefaultClickAction(event -> event.setCancelled(true)); this.setItems(user); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java index b99ff709..555aff0f 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java @@ -47,7 +47,6 @@ public class DyeSelectorGui extends CosmeticGui { create(); final Player player = user.getPlayer(); - player.sendMessage("Getting Gui"); if (type != null) { final Integer selected = this.cosmeticsSlots.inverse().get(type); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java index 4969598e..c88ab2a4 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java @@ -1,46 +1,103 @@ package io.github.fisher2911.hmccosmetics.listener; +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.user.User; import io.github.fisher2911.hmccosmetics.user.UserManager; +import io.th0rgal.oraxen.utils.armorequipevent.ArmorEquipEvent; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.HumanEntity; 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.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.InventoryInteractEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.spigotmc.event.entity.EntityMountEvent; +import java.util.List; import java.util.Optional; +import java.util.Set; public class ClickListener implements Listener { private final HMCCosmetics plugin; private final UserManager userManager; + private final List equipmentSlots = List.of(39, 40); + public ClickListener(final HMCCosmetics plugin) { this.plugin = plugin; this.userManager = this.plugin.getUserManager(); } @EventHandler - public void onHelmetClick(final InventoryClickEvent event) { + public void onCosmeticClick(final InventoryClickEvent event) { final HumanEntity player = event.getWhoClicked(); + if (!(player instanceof Player)) return; + this.fixInventory((Player) player, Set.of(event.getSlot()), event.getClickedInventory()); + } + + @EventHandler + public void onCosmeticClick(final InventoryDragEvent event) { + final HumanEntity player = event.getWhoClicked(); + if (!(player instanceof Player)) return; + this.fixInventory((Player) player, event.getInventorySlots(), event.getView().getBottomInventory()); + } + + @EventHandler + public void onArmorEquip(final PlayerArmorChangeEvent event) { + final Player player = event.getPlayer(); final Optional optionalUser = this.userManager.get(player.getUniqueId()); if (optionalUser.isEmpty()) { return; } - if (event.getClickedInventory() instanceof final PlayerInventory inventory) { + this.doRunnable(optionalUser.get()); + } + + @EventHandler + public void onRightClick(final PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + final Player player = event.getPlayer(); + + final ItemStack mainHand = event.getPlayer().getInventory().getItemInMainHand(); + + if (mainHand.getType().isBlock() && mainHand.getAmount() > 0) return; + + this.userManager.updateCosmetics(player.getUniqueId(), true); + } + + private void fixInventory(final Player player, final Set slotsClicked, final Inventory inventory) { + final Optional optionalUser = this.userManager.get(player.getUniqueId()); + + if (optionalUser.isEmpty()) { + return; + } + + if (inventory instanceof PlayerInventory) { final User user = optionalUser.get(); - if (event.getSlot() == 39) { - Bukkit.getScheduler().runTaskLater(this.plugin, () -> { - this.userManager.updateHat(user); - }, 1); + for (int i : slotsClicked) { + if (this.equipmentSlots.contains(i)) { + this.doRunnable(user); + } } } } + private void doRunnable(final User user) { + Bukkit.getScheduler().runTaskLater( + this.plugin, () -> this.userManager.updateCosmetics(user), + 1); + } + } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java new file mode 100644 index 00000000..c9c2dcab --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java @@ -0,0 +1,45 @@ +package io.github.fisher2911.hmccosmetics.listener; + +import com.comphenix.protocol.wrappers.EnumWrappers; +import io.github.fisher2911.hmccosmetics.HMCCosmetics; +import io.github.fisher2911.hmccosmetics.user.UserManager; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.spigotmc.event.entity.EntityMountEvent; + +public class CosmeticFixListener implements Listener { + + private final HMCCosmetics plugin; + private final UserManager userManager; + + public CosmeticFixListener(final HMCCosmetics plugin) { + this.plugin = plugin; + this.userManager = this.plugin.getUserManager(); + } + + @EventHandler + public void onEntityMount(final EntityMountEvent event) { + if (!(event.getEntity() instanceof final Player player)) return; + this.fixCosmetics(player); + } + + @EventHandler + public void onOffhandSwap(final PlayerSwapHandItemsEvent event) { + final ItemStack offHand = event.getOffHandItem(); + if (offHand != null && offHand.getType() != Material.AIR) return; + this.fixCosmetics(event.getPlayer()); + } + + private void fixCosmetics(final Player player) { + Bukkit.getScheduler().runTaskLater(this.plugin, + () -> this.userManager.updateCosmetics(player.getUniqueId(), true), 2); + } +} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java deleted file mode 100644 index 328cbf49..00000000 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.github.fisher2911.hmccosmetics.listener; - -import io.github.fisher2911.hmccosmetics.HMCCosmetics; -import io.github.fisher2911.hmccosmetics.user.UserManager; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.spigotmc.event.entity.EntityMountEvent; - -public class HatRemoveFixListener implements Listener { - - private final HMCCosmetics plugin; - private final UserManager userManager; - - public HatRemoveFixListener(final HMCCosmetics plugin) { - this.plugin = plugin; - this.userManager = this.plugin.getUserManager(); - } - - @EventHandler - public void onInventoryClick(final InventoryClickEvent event) { - if (!(event.getWhoClicked() instanceof final Player player)) return; - this.fixHat(player); - } - - @EventHandler - public void onInventoryDrag(final InventoryDragEvent event) { - if (!(event.getWhoClicked() instanceof final Player player)) return; - this.fixHat(player); - } - - @EventHandler - public void test(final EntityMountEvent event) { - if (!(event.getEntity() instanceof final Player player)) return; - this.fixHat(player); - } - - private void fixHat(final Player player) { - Bukkit.getScheduler().runTaskLater( - this.plugin, - () -> this.userManager.get(player.getUniqueId()).ifPresent(this.userManager::setFakeHelmet), - 1); - } -} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/RespawnListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/RespawnListener.java index 6124c414..f093cee2 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/RespawnListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/RespawnListener.java @@ -26,7 +26,11 @@ public class RespawnListener implements Listener { Bukkit.getScheduler().runTaskLater(this.plugin, () -> { final Player player = event.getPlayer(); final Optional optionalUser = this.userManager.get(player.getUniqueId()); - optionalUser.ifPresent(user -> this.userManager.setItem(user, user.getPlayerArmor().getHat())); + optionalUser.ifPresent(user -> { + user.despawnAttached(); + this.userManager.updateCosmetics(user); + this.userManager.setItem(user, user.getPlayerArmor().getHat()); + }); }, 1); } } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java index 6be9b4d1..231aeff7 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -21,11 +21,14 @@ import io.github.fisher2911.hmccosmetics.util.Keys; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftEntityEquipment; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; +import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; @@ -54,17 +57,13 @@ public class UserManager { public void add(final User user) { this.userMap.put(user.getUuid(), user); this.armorStandIdMap.put(user.getArmorStandId(), user); - this.setFakeHelmet(user); + this.updateCosmetics(user); } public Optional get(final UUID uuid) { return Optional.ofNullable(this.userMap.get(uuid)); } - public void updateHat(final User user) { - this.setFakeHelmet(user); - } - public void remove(final UUID uuid) { final User user = this.userMap.remove(uuid); @@ -72,11 +71,8 @@ public class UserManager { this.armorStandIdMap.remove(user.getArmorStandId()); - // todo - remove - this.plugin.getDatabase().saveUser(user); - user.removeAllCosmetics(); - this.setFakeHelmet(user); + this.updateCosmetics(user); user.despawnAttached(); } @@ -90,9 +86,9 @@ public class UserManager { } public void resendCosmetics(final Player player) { - for (final User user : this.userMap.values()) { - user.spawnArmorStand(player); - } + for (final User user : this.userMap.values()) { + user.spawnArmorStand(player); + } } private void registerPacketListener() { @@ -142,33 +138,35 @@ public class UserManager { }); } - public void setFakeHelmet(final User user) { + public void updateCosmetics(final UUID uuid, final boolean ignoreRestrictions) { + this.get(uuid).ifPresent(user -> this.updateCosmetics(user, ignoreRestrictions)); - ItemStack hat = user.getPlayerArmor().getHat().getColored(); + } + + public void updateCosmetics(final UUID uuid) { + this.updateCosmetics(uuid, false); + } + + public void updateCosmetics(final User user) { + this.updateCosmetics(user, false); + } + + public void updateCosmetics(final User user, final boolean ignoreRestrictions) { final Player player = user.getPlayer(); - if (player == null || hat == null) { + if (player == null) { return; } - - if (hat.getType() == Material.AIR) { - final EntityEquipment equipment = player.getEquipment(); - if (equipment != null) { - hat = equipment.getHelmet() == null ? hat : equipment.getHelmet(); - } - } + final PlayerArmor playerArmor = user.getPlayerArmor(); final List> equipmentList = new ArrayList<>(); - final Map placeholders = Map.of(Placeholder.ALLOWED, "true", - Placeholder.ENABLED, "true"); - - equipmentList.add(new Pair<>(EnumWrappers.ItemSlot.HEAD, - ItemBuilder.from(hat). - namePlaceholders(placeholders). - lorePlaceholders(placeholders). - build() - )); + equipmentList.add( + new Pair<>(EnumWrappers.ItemSlot.HEAD, this.getCosmeticItem(player, playerArmor.getHat(), EquipmentSlot.HEAD, ignoreRestrictions)) + ); + equipmentList.add( + new Pair<>(EnumWrappers.ItemSlot.OFFHAND, this.getCosmeticItem(player, playerArmor.getOffHand(), EquipmentSlot.OFF_HAND, ignoreRestrictions)) + ); final PacketContainer fake = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); @@ -184,19 +182,53 @@ public class UserManager { } } + private ItemStack getCosmeticItem( + final Player player, + final ArmorItem armorItem, + final EquipmentSlot slot, + final boolean ignoreRestrictions) { + final EntityEquipment equipment = player.getEquipment(); + + final Map placeholders = Map.of(Placeholder.ALLOWED, "true", + Placeholder.ENABLED, "true"); + + ItemStack itemStack = ItemBuilder.from(armorItem.getColored()). + namePlaceholders(placeholders). + lorePlaceholders(placeholders). + build(); + + if (itemStack.getType() != Material.AIR && + (slot != EquipmentSlot.OFF_HAND || ignoreRestrictions)) return itemStack; + + if (equipment == null) return itemStack; + + final ItemStack equipped = equipment.getItem(slot); + + if (equipped != null && equipped.getType() != Material.AIR) return equipped; + + return itemStack; + } + public void setItem(final User user, final ArmorItem armorItem) { user.setItem(armorItem); switch (armorItem.getType()) { - case HAT -> this.setFakeHelmet(user); - case OFF_HAND -> /* todo */ {} + case HAT, OFF_HAND -> this.updateCosmetics(user); } + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> this.plugin.getDatabase().saveUser(user)); } public void removeItem(final User user, final ArmorItem.Type type) { this.setItem(user, ArmorItem.empty(type)); } - // returns set item + /** + * + * @param user + * @param armorItem + * @param removeMessage + * @param setMessage + * @return the item that was set + */ public ArmorItem setOrUnset( final User user, final ArmorItem armorItem, @@ -204,18 +236,18 @@ public class UserManager { final Message setMessage) { final Player player = user.getPlayer(); - final ArmorItem empty = ArmorItem.empty(armorItem.getType()); + final ArmorItem.Type type = armorItem.getType(); + + final ArmorItem empty = ArmorItem.empty(type); if (player == null) { return empty; } - final ArmorItem check = user.getPlayerArmor().getItem(armorItem.getType()); - - final ArmorItem.Type type = armorItem.getType(); + final ArmorItem check = user.getPlayerArmor().getItem(type); if (armorItem.getId().equals(check.getId())) { - user.setItem(ArmorItem.empty(type)); + this.setItem(user, ArmorItem.empty(type)); messageHandler.sendMessage( player, @@ -225,7 +257,7 @@ public class UserManager { return empty; } - user.setItem(armorItem); + this.setItem(user, armorItem); messageHandler.sendMessage( player, setMessage diff --git a/src/main/resources/database/info.yml b/src/main/resources/database/info.yml new file mode 100644 index 00000000..c78688b0 --- /dev/null +++ b/src/main/resources/database/info.yml @@ -0,0 +1 @@ +version: 1.0 \ No newline at end of file