diff --git a/pom.xml b/pom.xml index 9cc5baf..64e4e4a 100644 --- a/pom.xml +++ b/pom.xml @@ -68,5 +68,33 @@ 1.21.1-R0.1-SNAPSHOT provided + + + + org.hibernate + hibernate-core + 6.6.1.Final + + + + + mysql + mysql-connector-java + 8.0.33 + + + + + jakarta.persistence + jakarta.persistence-api + 3.0.0 + + + + + org.hibernate.common + hibernate-commons-annotations + 5.1.2.Final + diff --git a/src/main/java/commands/tabCompleter.java b/src/main/java/commands/tabCompleter.java new file mode 100644 index 0000000..1f86e88 --- /dev/null +++ b/src/main/java/commands/tabCompleter.java @@ -0,0 +1,33 @@ +package commands; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class tabCompleter implements TabCompleter { + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { + List completions = new ArrayList<>(); + + if (command.getName().equalsIgnoreCase("tpw") && commandSender.isOp()) { + if (strings.length == 1) { + for (World world : Bukkit.getWorlds()) { + completions.add(world.getName()); + } + } else if (strings.length == 2) { + for (Player player : Bukkit.getOnlinePlayers()) { + completions.add(player.getName()); + } + } + } + + return completions; + } +} diff --git a/src/main/java/commands/teleportWorld.java b/src/main/java/commands/teleportWorld.java new file mode 100644 index 0000000..9bb51b9 --- /dev/null +++ b/src/main/java/commands/teleportWorld.java @@ -0,0 +1,62 @@ +package commands; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class teleportWorld implements CommandExecutor { + + // Teleports player with OP to another world. + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (commandSender instanceof Player) { + + Player player = (Player) commandSender; + + if (!player.isOp() || strings.length == 0) { + return false; + } + + World world = Bukkit.getWorld(strings[0]); + + if (world == null) { + player.sendMessage("This is not a valid world!"); + return true; + } + + if (strings.length > 1) { + try { + Player targetPlayer = Bukkit.getPlayer(strings[1]); + World targetPlayerWorld = targetPlayer.getWorld(); + + if (targetPlayerWorld.equals(world)) { + player.sendMessage(String.format("Player %s is already in this world!", strings[1])); + return true; + } + + targetPlayer.teleport(world.getSpawnLocation()); + targetPlayer.sendMessage(String.format("Successfully teleported %s from %s to %s.", strings[1], targetPlayerWorld.getName(), world.getName())); + return true; + } catch (Exception e) { + player.sendMessage("This is not a valid player!"); + return true; + } + } + + World playerWorld = player.getWorld(); + + if (playerWorld.equals(world)) { + player.sendMessage("You are already in this world!"); + return true; + } + + player.teleport(world.getSpawnLocation()); + player.sendMessage(String.format("Successfully teleported from %s to %s.", playerWorld.getName(), world.getName())); + return true; + } + return false; + } +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java index be4ffea..d295e3b 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java @@ -1,22 +1,33 @@ package xyz.soukup.mineconomiaCoreV2; +import commands.tabCompleter; +import commands.teleportWorld; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; +import xyz.soukup.mineconomiaCoreV2.database.HibernateUtil; import xyz.soukup.mineconomiaCoreV2.tractor.giveTractorCommand; import java.util.Objects; +import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.plugin; + public final class MineconomiaCoreV2 extends JavaPlugin { - MineconomiaCoreV2 plugin = getPlugin(this.getClass()); + private static MineconomiaCoreV2 instance; + + @Override public void onEnable() { // Plugin startup logic + instance = this; getLogger().info("STARTING MINECONOMIA CORE"); - plugin.saveConfig(); + plugin.saveDefaultConfig(); // Tractor registration Objects.requireNonNull(plugin.getCommand("tractor")).setExecutor(new giveTractorCommand()); + // TPW registration + this.getCommand("tpw").setExecutor(new teleportWorld()); + this.getCommand("tpw").setTabCompleter(new tabCompleter()); @@ -25,6 +36,10 @@ public final class MineconomiaCoreV2 extends JavaPlugin { @Override public void onDisable() { // Plugin shutdown logic + HibernateUtil.shutdown(); } + public static MineconomiaCoreV2 getInstance() { + return instance; + } } diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/sharedValues.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/core/sharedValues.java index 989729a..3178e29 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/sharedValues.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/core/sharedValues.java @@ -1,12 +1,14 @@ package xyz.soukup.mineconomiaCoreV2.core; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.java.JavaPlugin; import xyz.soukup.mineconomiaCoreV2.MineconomiaCoreV2; import java.util.logging.Logger; public class sharedValues { - public static MineconomiaCoreV2 plugin = MineconomiaCoreV2.getPlugin(MineconomiaCoreV2.class); + public static MineconomiaCoreV2 plugin = MineconomiaCoreV2.getInstance(); public static FileConfiguration config = plugin.getConfig(); public static Logger logger = plugin.getLogger(); } diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/database/HibernateUtil.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/HibernateUtil.java new file mode 100644 index 0000000..37c531c --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/HibernateUtil.java @@ -0,0 +1,113 @@ +package xyz.soukup.mineconomiaCoreV2.database; + +import jakarta.persistence.Query; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import org.bukkit.scoreboard.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.model.internal.QueryBinder; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import xyz.soukup.mineconomiaCoreV2.core.sharedValues; +import xyz.soukup.mineconomiaCoreV2.variables.PlayerData; + +import java.util.List; +import java.util.Objects; +import java.util.Properties; + +import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.config; +import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.logger; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + static { + + try { + + StandardServiceRegistry registry = new StandardServiceRegistryBuilder() + .applySettings(getHibernateProperties()) + .build(); + + sessionFactory = new MetadataSources(registry) + .addAnnotatedClass(PlayerData.class) + .buildMetadata() + .buildSessionFactory(); + + } catch (Exception e) { + + sharedValues.logger.warning(e.toString()); + + if (sessionFactory != null) { + sessionFactory.close(); + } + + } + } + + + private static Properties getHibernateProperties() { + + String host = config.getString("database.host"); + String port = config.getString("database.port"); + String user = config.getString("database.user"); + String password = config.getString("database.password"); + String database = config.getString("database.database"); + + String jdbcString = "jdbc:mysql://" + host + ":" + port + "/" + database; + + Properties properties = new Properties(); + properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); + properties.put("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver"); + properties.put("hibernate.connection.url", jdbcString); + properties.put("hibernate.connection.username", user); + properties.put("hibernate.connection.password", password); + properties.put("hibernate.hbm2ddl.auto", "update"); + properties.put("hibernate.show_sql", "true"); + return properties; + } + + + public static SessionFactory getSessionFactory() { + return sessionFactory; + } + + public static Session newSession(){ + return getSessionFactory().openSession(); + } + + public static void shutdown() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } + + + public static void saveToDatabase(Object object){ + + Session session = HibernateUtil.newSession(); + Transaction transaction = null; + + try { + + transaction = session.beginTransaction(); + session.persist(object); + transaction.commit(); + session.close(); + + }catch (Exception e){ + + if (transaction != null) { + transaction.rollback(); // Rollback if something goes wrong + } + + logger.warning(e.toString()); + } + } + + + +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerDataDatabase.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerDataDatabase.java new file mode 100644 index 0000000..8f507f5 --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerDataDatabase.java @@ -0,0 +1,18 @@ +package xyz.soukup.mineconomiaCoreV2.database; + +import jakarta.persistence.criteria.CriteriaBuilder; +import xyz.soukup.mineconomiaCoreV2.variables.PlayerData; + + +public class PlayerDataDatabase { + + public static void savePlayerDataToDatabase(PlayerData playerData){ + HibernateUtil.saveToDatabase(playerData); + } + + public static PlayerData getPlayerDataFromDatabase(String nickname){ + CriteriaBuilder criteriaBuilder = HibernateUtil.newSession().getCriteriaBuilder(); + return null; + } + +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerInit.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerInit.java new file mode 100644 index 0000000..3232d21 --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/PlayerInit.java @@ -0,0 +1,5 @@ +package xyz.soukup.mineconomiaCoreV2.database; + +public class PlayerInit { + public static void onJoin(){} +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/MsgRetriever.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/LangManager.java similarity index 81% rename from src/main/java/xyz/soukup/mineconomiaCoreV2/core/MsgRetriever.java rename to src/main/java/xyz/soukup/mineconomiaCoreV2/tools/LangManager.java index 1f001ab..4375fb6 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/MsgRetriever.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/LangManager.java @@ -1,12 +1,11 @@ -package xyz.soukup.mineconomiaCoreV2.core; +package xyz.soukup.mineconomiaCoreV2.tools; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.inventory.Inventory; import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.config; import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.plugin; -public class MsgRetriever { +public class LangManager { public static YamlConfiguration lang = null; public static void loadLang(){ diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/PDC.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/PDC.java similarity index 96% rename from src/main/java/xyz/soukup/mineconomiaCoreV2/core/PDC.java rename to src/main/java/xyz/soukup/mineconomiaCoreV2/tools/PDC.java index 2d76800..9ba160e 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/core/PDC.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/PDC.java @@ -1,4 +1,4 @@ -package xyz.soukup.mineconomiaCoreV2.core; +package xyz.soukup.mineconomiaCoreV2.tools; import org.bukkit.NamespacedKey; import org.bukkit.block.TileState; @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import xyz.soukup.mineconomiaCoreV2.core.sharedValues; //funkce pro lehčí manipulaci s minecraft PDC (trvalé uchovávání dat v entitách, itemech a blocích) public class PDC { diff --git a/src/main/java/tools/inventoryTools.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/inventoryTools.java similarity index 93% rename from src/main/java/tools/inventoryTools.java rename to src/main/java/xyz/soukup/mineconomiaCoreV2/tools/inventoryTools.java index 5d7d431..aeee557 100644 --- a/src/main/java/tools/inventoryTools.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/tools/inventoryTools.java @@ -1,4 +1,4 @@ -package tools; +package xyz.soukup.mineconomiaCoreV2.tools; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java new file mode 100644 index 0000000..5d80eb3 --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java @@ -0,0 +1,61 @@ +package xyz.soukup.mineconomiaCoreV2.variables; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +//Definování Member classy pro databázi a další manipulace + +@Entity +public class PlayerData { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + private String nickname; + private String uuid; + private int online; + private float money; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public int getOnline() { + return online; + } + + public void setOnline(int online) { + this.online = online; + } + + public float getMoney() { + return money; + } + + public void setMoney(float money) { + this.money = money; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 46ccd95..5aa99c5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,2 +1,8 @@ version: 1.0 -language: "czech.yml" \ No newline at end of file +language: "czech.yml" +database: + host: localhost + port: 3306 + user: mcore + password: mcore + database: mcore \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b1c2bf9..7786bc5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,5 +3,8 @@ version: '1.0-SNAPSHOT' main: xyz.soukup.mineconomiaCoreV2.MineconomiaCoreV2 api-version: '1.21' commands: + tpw: + description: "Teleportuje tě do jiného světa" + usage: / [arguments] tractor: description: "blieat"