9
0
mirror of https://github.com/HibiscusMC/HMCCosmetics.git synced 2025-12-28 19:39:14 +00:00

Off hand works now, and added some database converter stuff

This commit is contained in:
HeroBrineGoat
2022-01-21 17:59:59 -05:00
parent 81db0cab06
commit b63c130730
16 changed files with 320 additions and 120 deletions

View File

@@ -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)

View File

@@ -43,17 +43,24 @@ public class Database {
protected final HMCCosmetics plugin;
private final ConnectionSource dataSource;
private final DatabaseType databaseType;
final Dao<UserDAO, UUID> userDao;
final Dao<ArmorItemDAO, UserDAO> 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<UserDAO, UUID> getUserDao() {
return userDao;
}
public Dao<ArmorItemDAO, UserDAO> getArmorItemDao() {
return armorItemDao;
}
// public abstract void close();
//
// public abstract String getSaveStatement();
//

View File

@@ -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();
}
}
}

View File

@@ -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;
};

View File

@@ -0,0 +1,9 @@
package io.github.fisher2911.hmccosmetics.database;
public enum DatabaseType {
MYSQL,
SQLITE
}

View File

@@ -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();

View File

@@ -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 =

View File

@@ -263,5 +263,6 @@ public class ArmorItem extends GuiItem {
BACKPACK,
OFF_HAND
}
}

View File

@@ -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<InventoryClickEvent> 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);

View File

@@ -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);

View File

@@ -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<Integer> 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<User> 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<Integer> slotsClicked, final Inventory inventory) {
final Optional<User> 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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -26,7 +26,11 @@ public class RespawnListener implements Listener {
Bukkit.getScheduler().runTaskLater(this.plugin, () -> {
final Player player = event.getPlayer();
final Optional<User> 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);
}
}

View File

@@ -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<User> 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<Pair<EnumWrappers.ItemSlot, ItemStack>> equipmentList = new ArrayList<>();
final Map<String, String> 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<String, String> 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