From 05484439a236759336319a5b2d043671949b8402 Mon Sep 17 00:00:00 2001 From: Referix Date: Sun, 14 Sep 2025 18:05:04 +0300 Subject: [PATCH 1/4] rebuild database system Hibernate migrate a ORMlite and refactor plugin.yml {micro fix calculate system} --- build.gradle | 18 +-- src/main/java/dev/lotus/studio/Main.java | 29 +++-- .../dev/lotus/studio/command/MainCommand.java | 2 +- .../lotus/studio/command/SafeZoneCommand.java | 16 +-- .../studio/database/DatabaseInitializer.java | 87 +++++++++++++ .../database/hibernate/HibernateUtil.java | 56 --------- .../playerdata/PlayerDataRepository.java | 63 ---------- .../hibernate/savezone/SaveZoneData.java | 42 ------- .../savezone/SaveZoneDataRepository.java | 116 ------------------ .../savezone/SaveZoneDataServiceImpl.java | 63 ---------- .../playerdata/PlayerDataBase.java | 28 +++-- .../playerdata/PlayerDataRepository.java | 43 +++++++ .../playerdata/PlayerDataService.java | 2 +- .../playerdata/PlayerDataServiceImpl.java | 39 ++++-- .../database/savezone/SafeZoneDataBase.java | 45 +++++++ .../savezone/SaveZoneDataRepository.java | 76 ++++++++++++ .../savezone/SaveZoneDataService.java | 4 +- .../savezone/SaveZoneDataServiceImpl.java | 89 ++++++++++++++ .../lotus/studio/event/JoinLeaveEvent.java | 24 ++-- .../studio/handlers/RadiationHandler.java | 18 +-- .../studio/handlers/TemperatureHandler.java | 2 +- .../studio/safezone/SafeZoneManager.java | 8 +- src/main/resources/plugin.yml | 5 +- 23 files changed, 457 insertions(+), 418 deletions(-) create mode 100644 src/main/java/dev/lotus/studio/database/DatabaseInitializer.java delete mode 100644 src/main/java/dev/lotus/studio/database/hibernate/HibernateUtil.java delete mode 100644 src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataRepository.java delete mode 100644 src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneData.java delete mode 100644 src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataRepository.java delete mode 100644 src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataServiceImpl.java rename src/main/java/dev/lotus/studio/database/{hibernate => }/playerdata/PlayerDataBase.java (58%) create mode 100644 src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java rename src/main/java/dev/lotus/studio/database/{hibernate => }/playerdata/PlayerDataService.java (87%) rename src/main/java/dev/lotus/studio/database/{hibernate => }/playerdata/PlayerDataServiceImpl.java (51%) create mode 100644 src/main/java/dev/lotus/studio/database/savezone/SafeZoneDataBase.java create mode 100644 src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataRepository.java rename src/main/java/dev/lotus/studio/database/{hibernate => }/savezone/SaveZoneDataService.java (77%) create mode 100644 src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataServiceImpl.java diff --git a/build.gradle b/build.gradle index bbad279..e493c6e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + plugins { id 'java' id 'com.github.johnrengelman.shadow' version '8.1.1' @@ -21,7 +23,7 @@ repositories { url = "https://maven.enginehub.org/repo/" } maven { url 'https://jitpack.io' } - maven { url "https://repository.jboss.org/nexus/content/repositories/releases/" } // JBoss репозиторій + maven { url "https://repository.jboss.org/nexus/content/repositories/releases/" } maven { url "https://repo.oraxen.com/releases" } @@ -31,15 +33,8 @@ dependencies { compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") compileOnly 'io.th0rgal:oraxen:1.184.1' compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.15") - implementation 'org.hibernate.orm:hibernate-core:6.6.1.Final' - implementation 'org.hibernate.orm:hibernate-community-dialects:6.6.1.Final' - implementation 'org.xerial:sqlite-jdbc:3.47.0.0' - // https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime - implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.5' - // https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-core - implementation 'org.glassfish.jaxb:jaxb-core:4.0.5' - // https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api - implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2' + implementation("org.xerial:sqlite-jdbc:3.50.3.0") + implementation("com.j256.ormlite:ormlite-jdbc:6.1") } java { @@ -48,7 +43,6 @@ java { } } - shadowJar { archiveClassifier.set('') duplicatesStrategy = DuplicatesStrategy.EXCLUDE @@ -63,4 +57,4 @@ processResources { filesMatching('paper-plugin.yml') { expand props } -} +} \ No newline at end of file diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index 1c4b7f8..8cdb3d6 100644 --- a/src/main/java/dev/lotus/studio/Main.java +++ b/src/main/java/dev/lotus/studio/Main.java @@ -1,20 +1,23 @@ package dev.lotus.studio; +import com.j256.ormlite.support.ConnectionSource; +import dev.lotus.studio.database.DatabaseInitializer; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; -import dev.lotus.studio.database.hibernate.playerdata.PlayerDataServiceImpl; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataServiceImpl; +import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl; +import dev.lotus.studio.database.savezone.SaveZoneDataService; +import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl; import dev.lotus.studio.event.EatEvent; import dev.lotus.studio.event.JoinLeaveEvent; import dev.lotus.studio.item.CustomItemManager; import dev.lotus.studio.command.MainCommand; -import dev.lotus.studio.database.hibernate.HibernateUtil; import dev.lotus.studio.event.ArmorEvent; import dev.lotus.studio.playerdata.PlayerBar; import dev.lotus.studio.playerdata.PlayerManager; import dev.lotus.studio.safezone.SafeZoneManager; +import java.sql.SQLException; + public final class Main extends JavaPlugin { private static Main instance; @@ -25,7 +28,7 @@ public final class Main extends JavaPlugin { private PlayerDataServiceImpl playerDataBase; private SaveZoneDataService saveZoneDataService; - + private DatabaseInitializer databaseInitializer; @@ -36,8 +39,14 @@ public void onEnable() { PlayerManager.getInstance().startGlobalTask(); //cfg itemManager = new CustomItemManager(); - this.playerDataBase = new PlayerDataServiceImpl(); - this.saveZoneDataService = new SaveZoneDataServiceImpl(); + databaseInitializer = new DatabaseInitializer(this); + try { + ConnectionSource connectionSource = databaseInitializer.openConnection(); + this.playerDataBase = new PlayerDataServiceImpl(connectionSource); + this.saveZoneDataService = new SaveZoneDataServiceImpl(connectionSource); + } catch (SQLException e) { + throw new RuntimeException(e); + } itemManager.loadItems(); getServer().getPluginManager().registerEvents(new ArmorEvent(itemManager),this); @@ -57,10 +66,8 @@ public void onEnable() { @Override public void onDisable() { PlayerManager.getInstance().getGlobalTask().cancel(); - // Закриття SessionFactory Hibernate при вимкненні плагіна - if (HibernateUtil.getSessionFactory() != null) { - HibernateUtil.getSessionFactory().close(); - } + // Закриття DataBase + databaseInitializer.closeConnection(); getLogger().info("LotusOffSeason plugin disabled!"); HandlerList.unregisterAll(this); } diff --git a/src/main/java/dev/lotus/studio/command/MainCommand.java b/src/main/java/dev/lotus/studio/command/MainCommand.java index 33de627..da7256f 100644 --- a/src/main/java/dev/lotus/studio/command/MainCommand.java +++ b/src/main/java/dev/lotus/studio/command/MainCommand.java @@ -4,7 +4,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService; +import dev.lotus.studio.database.savezone.SaveZoneDataService; import dev.lotus.studio.item.CustomItemManager; import java.util.ArrayList; diff --git a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java b/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java index 4399938..2b15641 100644 --- a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java +++ b/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java @@ -4,8 +4,8 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneData; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService; +import dev.lotus.studio.database.savezone.SafeZoneDataBase; +import dev.lotus.studio.database.savezone.SaveZoneDataService; import java.util.HashMap; import java.util.List; @@ -70,9 +70,9 @@ public boolean execute(CommandSender sender, String label, String[] args) { } private void removeZoneToDB(Player player, int id) { - service.getAllSaveZones().forEach(saveZoneData -> { - if (saveZoneData.getSafeZoneId() == id){ - player.sendMessage("Сейв зону удаленно с названием: " + saveZoneData.getSafeZoneName() + " ID: " + saveZoneData.getSafeZoneId()); + service.getAllSaveZones().forEach(safeZoneDataBase -> { + if (safeZoneDataBase.getSafeZoneId() == id){ + player.sendMessage("Сейв зону удаленно с названием: " + safeZoneDataBase.getSafeZoneName() + " ID: " + safeZoneDataBase.getSafeZoneId()); } }); service.removeProtectZone(id); @@ -80,17 +80,17 @@ private void removeZoneToDB(Player player, int id) { private void listZoneToDB(Player player) { // Отримуємо всі збережені зони з бази даних - List saveZoneDatas = service.getAllSaveZones(); + List safeZoneDataBases = service.getAllSaveZones(); // Якщо зон немає, повідомляємо гравця - if (saveZoneDatas.isEmpty()) { + if (safeZoneDataBases.isEmpty()) { player.sendMessage("нет зон."); return; } // Формуємо мапу з імен зон і їх ідентифікаторів HashMap saveId = new HashMap<>(); - saveZoneDatas.forEach(saveZoneData -> saveId.put(saveZoneData.getSafeZoneName(), saveZoneData.getSafeZoneId())); + safeZoneDataBases.forEach(saveZoneData -> saveId.put(saveZoneData.getSafeZoneName(), saveZoneData.getSafeZoneId())); // Виводимо гравцю список зон player.sendMessage("Список зон:"); diff --git a/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java b/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java new file mode 100644 index 0000000..1eea5b5 --- /dev/null +++ b/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java @@ -0,0 +1,87 @@ +package dev.lotus.studio.database; + +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import dev.lotus.studio.database.playerdata.PlayerDataBase; +import dev.lotus.studio.database.savezone.SafeZoneDataBase; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; +import java.sql.SQLException; +import java.util.logging.Logger; + +public class DatabaseInitializer { + + private final JavaPlugin plugin; + private final Logger logger; + private final String databasePath; + private ConnectionSource connectionSource; + + public DatabaseInitializer(JavaPlugin plugin) { + this.plugin = plugin; + this.logger = plugin.getLogger(); + this.databasePath = plugin.getDataFolder().getAbsolutePath() + File.separator + "database.db"; + try { + createDatabaseFile(); + createTables(); + } catch (IOException | SQLException e) { + throw new RuntimeException(e); + } + } + + /** + * Створюємо файл бази даних якщо його ще нема + */ + public void createDatabaseFile() throws IOException { + File dataFolder = plugin.getDataFolder(); + if (!dataFolder.exists()) dataFolder.mkdirs(); + + File databaseFile = new File(databasePath); + if (!databaseFile.exists()) { + if (databaseFile.createNewFile()) { + logger.info("Створено новий файл бази даних: " + databasePath); + } + } + } + + /** + * Повертає ORMLite ConnectionSource + */ + public ConnectionSource openConnection() throws SQLException { + if (connectionSource == null) { + String url = "jdbc:sqlite:" + databasePath; + connectionSource = new JdbcConnectionSource(url); + + logger.info("З’єднання з базою даних встановлено (ORMLite)"); + } + return connectionSource; + } + + /** + * Створюємо таблиці через ORMLite + */ + public void createTables() throws SQLException { + ConnectionSource cs = openConnection(); + + TableUtils.createTableIfNotExists(cs, PlayerDataBase.class); + TableUtils.createTableIfNotExists(cs, SafeZoneDataBase.class); + + logger.info("Таблиці ORMLite створені/перевірені"); + } + + /** + * Закриття з’єднання + */ + public void closeConnection() { + if (connectionSource != null) { + try { + connectionSource.close(); + logger.info("З’єднання з базою даних закрито"); + } catch (Exception e) { + logger.warning("Помилка закриття з’єднання: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/HibernateUtil.java b/src/main/java/dev/lotus/studio/database/hibernate/HibernateUtil.java deleted file mode 100644 index 1396f4f..0000000 --- a/src/main/java/dev/lotus/studio/database/hibernate/HibernateUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package dev.lotus.studio.database.hibernate; - - - -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.service.ServiceRegistry; -import dev.lotus.studio.Main; -import dev.lotus.studio.database.hibernate.playerdata.PlayerDataBase; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneData; - -import static org.bukkit.Bukkit.getLogger; -import static org.bukkit.Bukkit.getServer; - -public class HibernateUtil { - - private static SessionFactory sessionFactory; - - static { - try { - Configuration configuration = new Configuration(); - - // Налаштування бази даних - configuration.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC"); - configuration.setProperty("hibernate.connection.url", "jdbc:sqlite:plugins/LotusOffSeasonV2/database.db"); - configuration.setProperty("hibernate.dialect", "org.hibernate.community.dialect.SQLiteDialect"); - configuration.setProperty("hibernate.hbm2ddl.auto", "update"); - - // Показати SQL-запити в консолі - configuration.setProperty("hibernate.show_sql", "false"); - configuration.setProperty("hibernate.format_sql", "false"); - - // Додаємо анотовані класи - configuration.addAnnotatedClass(PlayerDataBase.class); - configuration.addAnnotatedClass(SaveZoneData.class); // Додайте сюди інші сутності - - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()).build(); - - sessionFactory = configuration.buildSessionFactory(serviceRegistry); - - getLogger().info("Hibernate initialized successfully!"); - } catch (Exception e) { - getLogger().severe("Failed to initialize Hibernate!"); - e.printStackTrace(); - getServer().getPluginManager().disablePlugin(Main.getInstance()); - throw new ExceptionInInitializerError("Initial SessionFactory creation failed" + e); - } - } - - public static SessionFactory getSessionFactory() { - return sessionFactory; - } -} - diff --git a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataRepository.java b/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataRepository.java deleted file mode 100644 index 76438d0..0000000 --- a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataRepository.java +++ /dev/null @@ -1,63 +0,0 @@ -package dev.lotus.studio.database.hibernate.playerdata; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import dev.lotus.studio.database.hibernate.HibernateUtil; - -public class PlayerDataRepository { - - private static final SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); - - public void savePlayerData(PlayerDataBase playerDataBase) { - Transaction transaction = null; - try (Session session = sessionFactory.openSession()) { - transaction = session.beginTransaction(); - session.saveOrUpdate(playerDataBase); // saveOrUpdate замість save - transaction.commit(); - } catch (Exception e) { - if (transaction != null) { - transaction.rollback(); - } - e.printStackTrace(); - } - } - - public PlayerDataBase getPlayerData(String playerName) { - try (Session session = sessionFactory.openSession()) { - return session.get(PlayerDataBase.class, playerName); - } - } - - public void updatePlayerData(PlayerDataBase playerDataBase) { - Transaction transaction = null; - try (Session session = sessionFactory.openSession()) { - transaction = session.beginTransaction(); - session.update(playerDataBase); - transaction.commit(); - } catch (Exception e) { - if (transaction != null) { - transaction.rollback(); - } - e.printStackTrace(); - } - } - - public void deletePlayerData(String playerName) { - Transaction transaction = null; - try (Session session = sessionFactory.openSession()) { - transaction = session.beginTransaction(); - PlayerDataBase playerDataBase = session.get(PlayerDataBase.class, playerName); - if (playerDataBase != null) { - session.delete(playerDataBase); - } - transaction.commit(); - } catch (Exception e) { - if (transaction != null) { - transaction.rollback(); - } - e.printStackTrace(); - } - } -} - diff --git a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneData.java b/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneData.java deleted file mode 100644 index 0241231..0000000 --- a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneData.java +++ /dev/null @@ -1,42 +0,0 @@ -package dev.lotus.studio.database.hibernate.savezone; - -import jakarta.persistence.*; - - -@Entity -@Table(name = "save_zone_data") -public class SaveZoneData { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "save_zone_id", nullable = false, unique = true) - private int structureId; - - @Column(name = "save_zone_name", nullable = false) - private String structureName; - - @Column(name = "save_zone_location", nullable = false) - private String locationValue; - - // Конструктори, геттери та сеттери - - public SaveZoneData() { - } - public SaveZoneData(String name, String locationValue) { - this.structureName = name; - this.locationValue = locationValue; - } - - public String getSafeZoneName() { - return structureName; - } - - public String getLocationValue() { - return locationValue; - } - - public int getSafeZoneId() { - return structureId; - } - -} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataRepository.java b/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataRepository.java deleted file mode 100644 index 7660afc..0000000 --- a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataRepository.java +++ /dev/null @@ -1,116 +0,0 @@ -package dev.lotus.studio.database.hibernate.savezone; - -import org.apache.commons.lang3.tuple.Pair; -import org.bukkit.Location; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import dev.lotus.studio.database.hibernate.HibernateUtil; - -import java.util.ArrayList; -import java.util.List; - -import static org.bukkit.Bukkit.getLogger; - -public class SaveZoneDataRepository { - - private static final SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); - - - - public void removeProtectZone(int id) { - if (sessionFactory == null) { - getLogger().severe("SessionFactory is not initialized. Cannot remove protect zone."); - return; - } - - Transaction transaction = null; - try (Session session = sessionFactory.openSession()) { - transaction = session.beginTransaction(); - - SaveZoneData saveZoneData = session.createQuery("FROM SaveZoneData WHERE id = :id", SaveZoneData.class) - .setParameter("id", id) // Підставляємо числовий ідентифікатор - .uniqueResult(); - - - if (saveZoneData != null) { - session.delete(saveZoneData); // Видаляємо знайдений запис - transaction.commit(); - getLogger().info("Protect zone '" + id + "' has been removed successfully."); - } else { - getLogger().warning("Protect zone '" + id + "' not found."); - if (transaction != null) transaction.rollback(); - } - } catch (Exception e) { - if (transaction != null && transaction.getStatus().canRollback()) { - transaction.rollback(); - getLogger().warning("Transaction rolled back due to an error."); - } - e.printStackTrace(); - } - } - - - public void saveStructureData(SaveZoneData saveZoneData) { - if (sessionFactory == null) { - getLogger().severe("SessionFactory is not initialized. Cannot save structure data."); - return; - } - - Transaction transaction = null; - try (Session session = sessionFactory.openSession()) { - transaction = session.beginTransaction(); - session.save(saveZoneData); - transaction.commit(); - } catch (Exception e) { - if (transaction != null && transaction.getStatus().canRollback()) { - transaction.rollback(); - getLogger().warning("Transaction rolled back due to an error."); - } - e.printStackTrace(); - } - } - - public List getAllStructuresData() { - List saveZoneData = new ArrayList<>(); - try (Session session = sessionFactory.openSession()) { - saveZoneData = session.createQuery("from SaveZoneData", SaveZoneData.class).getResultList(); - } catch (Exception e) { - e.printStackTrace(); - getLogger().severe("Ошибка при получении всех данных структур: " + e.getMessage()); - } - return saveZoneData; - } - - public List> getSaveZoneDataZones() { - List> zones = new ArrayList<>(); - try (Session session = sessionFactory.openSession()) { - List structures = session.createQuery( - "from SaveZoneData", - SaveZoneData.class) - .getResultList(); - - for (SaveZoneData structure : structures) { - String[] coordinates = structure.getLocationValue().split("\\|"); - if (coordinates.length == 2) { - String[] loc1 = coordinates[0].split(","); - String[] loc2 = coordinates[1].split(","); - Location location1 = new Location(null, // world can be added dynamically - Integer.parseInt(loc1[0].trim()), - Integer.parseInt(loc1[1].trim()), - Integer.parseInt(loc1[2].trim())); - Location location2 = new Location(null, - Integer.parseInt(loc2[0].trim()), - Integer.parseInt(loc2[1].trim()), - Integer.parseInt(loc2[2].trim())); - zones.add(Pair.of(location1, location2)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return zones; - } - - -} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataServiceImpl.java b/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataServiceImpl.java deleted file mode 100644 index 5d5013c..0000000 --- a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataServiceImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package dev.lotus.studio.database.hibernate.savezone; - -import org.apache.commons.lang3.tuple.Pair; -import org.bukkit.Location; - -import java.util.List; - -public class SaveZoneDataServiceImpl implements SaveZoneDataService { - - private final SaveZoneDataRepository saveZoneDataRepository = new SaveZoneDataRepository(); - - - @Override - public void saveProtectZone(String name, String location) { - SaveZoneData saveZoneData = new SaveZoneData(name, location); - saveZoneDataRepository.saveStructureData(saveZoneData); - } - - @Override - public void removeProtectZone(int id) { - saveZoneDataRepository.removeProtectZone(id); - } - - @Override - public List getAllSaveZones() { - return saveZoneDataRepository.getAllStructuresData(); - } - - @Override - public boolean isProtectZone(Location playerLocation) { - List> saveZoneDataZones = saveZoneDataRepository.getSaveZoneDataZones(); - for (Pair zone : saveZoneDataZones) { - if (isLocationInZone(playerLocation, zone.getLeft(), zone.getRight())) { - return true; - } - } - return false; - } - - // Логіка перевірки, чи знаходиться точка в зоні - private boolean isLocationInZone(Location location, Location loc1, Location loc2) { - int x1 = Math.min(loc1.getBlockX(), loc2.getBlockX()); - int y1 = Math.min(loc1.getBlockY(), loc2.getBlockY()); - int z1 = Math.min(loc1.getBlockZ(), loc2.getBlockZ()); - - int x2 = Math.max(loc1.getBlockX(), loc2.getBlockX()); - int y2 = Math.max(loc1.getBlockY(), loc2.getBlockY()); - int z2 = Math.max(loc1.getBlockZ(), loc2.getBlockZ()); - - int px = location.getBlockX(); - int py = location.getBlockY(); - int pz = location.getBlockZ(); - - return (px >= x1 && px <= x2) && - (py >= y1 && py <= y2) && - (pz >= z1 && pz <= z2); - } - - @Override - public List> getSaveZones() { - return saveZoneDataRepository.getSaveZoneDataZones(); - } -} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataBase.java b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataBase.java similarity index 58% rename from src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataBase.java rename to src/main/java/dev/lotus/studio/database/playerdata/PlayerDataBase.java index ee211af..b57c939 100644 --- a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataBase.java +++ b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataBase.java @@ -1,26 +1,20 @@ -package dev.lotus.studio.database.hibernate.playerdata; +package dev.lotus.studio.database.playerdata; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -@Entity -@Table(name = "player_data") +@DatabaseTable(tableName = "player_data") public class PlayerDataBase { - @Id - @Column(name = "player_name", nullable = false, unique = true) + @DatabaseField(id = true, columnName = "player_name") private String playerName; - @Column(name = "freeze_value", nullable = false) + @DatabaseField(columnName = "freeze_value", defaultValue = "30") private double freezeValue; - @Column(name = "radiation_value", nullable = false) + @DatabaseField(columnName = "radiation_value", defaultValue = "0") private double radiationValue; - // Конструктори, геттери та сеттери public PlayerDataBase() { } @@ -30,6 +24,14 @@ public PlayerDataBase(String playerName, double freezeValue, double radiationVal this.radiationValue = radiationValue; } + public String getPlayerName() { + return playerName; + } + + public void setPlayerName(String playerName) { + this.playerName = playerName; + } + public double getFreezeValue() { return freezeValue; } diff --git a/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java new file mode 100644 index 0000000..a554fad --- /dev/null +++ b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java @@ -0,0 +1,43 @@ +package dev.lotus.studio.database.playerdata; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; + +import java.sql.SQLException; + +public class PlayerDataRepository { + + private final Dao playerDao; + + public PlayerDataRepository(com.j256.ormlite.support.ConnectionSource connectionSource) throws SQLException { + this.playerDao = DaoManager.createDao(connectionSource, PlayerDataBase.class); + } + + /** + * Зберегти нового гравця + */ + public void savePlayerData(PlayerDataBase playerDataBase) throws SQLException { + playerDao.createIfNotExists(playerDataBase); + } + + /** + * Отримати дані гравця по імені + */ + public PlayerDataBase getPlayerData(String playerName) throws SQLException { + return playerDao.queryForId(playerName); + } + + /** + * Оновити дані гравця + */ + public void updatePlayerData(PlayerDataBase playerDataBase) throws SQLException { + playerDao.update(playerDataBase); + } + + /** + * Видалити дані гравця + */ + public void deletePlayerData(String playerName) throws SQLException { + playerDao.deleteById(playerName); + } +} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataService.java b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataService.java similarity index 87% rename from src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataService.java rename to src/main/java/dev/lotus/studio/database/playerdata/PlayerDataService.java index c35670f..2e47669 100644 --- a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataService.java +++ b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataService.java @@ -1,4 +1,4 @@ -package dev.lotus.studio.database.hibernate.playerdata; +package dev.lotus.studio.database.playerdata; import java.util.HashMap; diff --git a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataServiceImpl.java b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataServiceImpl.java similarity index 51% rename from src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataServiceImpl.java rename to src/main/java/dev/lotus/studio/database/playerdata/PlayerDataServiceImpl.java index 4ec7d0a..b2c2388 100644 --- a/src/main/java/dev/lotus/studio/database/hibernate/playerdata/PlayerDataServiceImpl.java +++ b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataServiceImpl.java @@ -1,19 +1,35 @@ -package dev.lotus.studio.database.hibernate.playerdata; +package dev.lotus.studio.database.playerdata; +import com.j256.ormlite.support.ConnectionSource; + +import java.sql.SQLException; import java.util.HashMap; public class PlayerDataServiceImpl implements PlayerDataService { - private final PlayerDataRepository playerDataRepository = new PlayerDataRepository(); + private final PlayerDataRepository playerDataRepository; + + public PlayerDataServiceImpl(ConnectionSource connectionSource) throws SQLException { + this.playerDataRepository = new PlayerDataRepository(connectionSource); + } @Override public void savePlayer(String playerName, double freezeValue, double radiationValue) { PlayerDataBase playerDataBase = new PlayerDataBase(playerName, freezeValue, radiationValue); - playerDataRepository.savePlayerData(playerDataBase); + try { + playerDataRepository.savePlayerData(playerDataBase); + } catch (SQLException e) { + e.printStackTrace(); // або логування через plugin.getLogger() + } } @Override public PlayerDataBase getPlayer(String playerName) { - return playerDataRepository.getPlayerData(playerName); + try { + return playerDataRepository.getPlayerData(playerName); + } catch (SQLException e) { + e.printStackTrace(); + return null; + } } @Override @@ -22,13 +38,21 @@ public void updatePlayer(String playerName, double freezeValue, double radiation if (playerDataBase != null) { playerDataBase.setFreezeValue(freezeValue); playerDataBase.setRadiationValue(radiationValue); - playerDataRepository.updatePlayerData(playerDataBase); + try { + playerDataRepository.updatePlayerData(playerDataBase); + } catch (SQLException e) { + e.printStackTrace(); + } } } @Override public void deletePlayer(String playerName) { - playerDataRepository.deletePlayerData(playerName); + try { + playerDataRepository.deletePlayerData(playerName); + } catch (SQLException e) { + e.printStackTrace(); + } } @Override @@ -40,7 +64,6 @@ public HashMap getValues(String playerName) { values.put("radiationValue", playerDataBase.getRadiationValue()); return values; } - return null; // або можна повернути порожній HashMap + return new HashMap<>(); // краще ніж null } } - diff --git a/src/main/java/dev/lotus/studio/database/savezone/SafeZoneDataBase.java b/src/main/java/dev/lotus/studio/database/savezone/SafeZoneDataBase.java new file mode 100644 index 0000000..1408c2a --- /dev/null +++ b/src/main/java/dev/lotus/studio/database/savezone/SafeZoneDataBase.java @@ -0,0 +1,45 @@ +package dev.lotus.studio.database.savezone; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "safe_zones") +public class SafeZoneDataBase { + + @DatabaseField(generatedId = true, columnName = "safe_zone_id") + private int safeZoneId; + + @DatabaseField(columnName = "safezone_name", canBeNull = false) + private String safeZoneName; + + @DatabaseField(columnName = "location_value", canBeNull = false) + private String locationValue; + + public SafeZoneDataBase() { + } + + public SafeZoneDataBase(String safeZoneName, String locationValue) { + this.safeZoneName = safeZoneName; + this.locationValue = locationValue; + } + + public int getSafeZoneId() { + return safeZoneId; + } + + public String getSafeZoneName() { + return safeZoneName; + } + + public void setSafeZoneName(String safeZoneName) { + this.safeZoneName = safeZoneName; + } + + public String getLocationValue() { + return locationValue; + } + + public void setLocationValue(String locationValue) { + this.locationValue = locationValue; + } +} diff --git a/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataRepository.java b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataRepository.java new file mode 100644 index 0000000..565a97f --- /dev/null +++ b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataRepository.java @@ -0,0 +1,76 @@ +package dev.lotus.studio.database.savezone; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; +import org.apache.commons.lang3.tuple.Pair; +import org.bukkit.Bukkit; +import org.bukkit.Location; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class SaveZoneDataRepository { + + private final Dao safeZoneDao; + + public SaveZoneDataRepository(ConnectionSource connectionSource) throws SQLException { + this.safeZoneDao = DaoManager.createDao(connectionSource, SafeZoneDataBase.class); + } + + /** + * Видалити зону по id + */ + public void removeProtectZone(int id) throws SQLException { + safeZoneDao.deleteById(id); + } + + /** + * Зберегти/оновити структуру + */ + public void saveStructureData(SafeZoneDataBase safeZoneDataBase) throws SQLException { + safeZoneDao.createOrUpdate(safeZoneDataBase); + } + + /** + * Отримати всі структури + */ + public List getAllStructuresData() throws SQLException { + return safeZoneDao.queryForAll(); + } + + /** + * Повертає список зон у форматі пар локацій (лок1, лок2) + */ + public List> getSaveZoneDataZones() throws SQLException { + List> zones = new ArrayList<>(); + List structures = getAllStructuresData(); + + for (SafeZoneDataBase structure : structures) { + String[] coordinates = structure.getLocationValue().split("\\|"); + if (coordinates.length == 2) { + String[] loc1 = coordinates[0].split(","); + String[] loc2 = coordinates[1].split(","); + + Location location1 = new Location( + Bukkit.getWorld("world"), // або передавати динамічно + Double.parseDouble(loc1[0].trim()), + Double.parseDouble(loc1[1].trim()), + Double.parseDouble(loc1[2].trim()) + ); + + Location location2 = new Location( + Bukkit.getWorld("world"), + Double.parseDouble(loc2[0].trim()), + Double.parseDouble(loc2[1].trim()), + Double.parseDouble(loc2[2].trim()) + ); + + zones.add(Pair.of(location1, location2)); + } + } + + return zones; + } +} diff --git a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataService.java b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataService.java similarity index 77% rename from src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataService.java rename to src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataService.java index bf73586..cf751fc 100644 --- a/src/main/java/dev/lotus/studio/database/hibernate/savezone/SaveZoneDataService.java +++ b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataService.java @@ -1,4 +1,4 @@ -package dev.lotus.studio.database.hibernate.savezone; +package dev.lotus.studio.database.savezone; import org.apache.commons.lang3.tuple.Pair; import org.bukkit.Location; @@ -11,7 +11,7 @@ public interface SaveZoneDataService { void removeProtectZone(int id); - List getAllSaveZones(); + List getAllSaveZones(); boolean isProtectZone(Location playerLocation); diff --git a/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataServiceImpl.java b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataServiceImpl.java new file mode 100644 index 0000000..dfee2b6 --- /dev/null +++ b/src/main/java/dev/lotus/studio/database/savezone/SaveZoneDataServiceImpl.java @@ -0,0 +1,89 @@ +package dev.lotus.studio.database.savezone; + +import com.j256.ormlite.support.ConnectionSource; +import org.apache.commons.lang3.tuple.Pair; +import org.bukkit.Location; + +import java.sql.SQLException; +import java.util.List; + +public class SaveZoneDataServiceImpl implements SaveZoneDataService { + + private final SaveZoneDataRepository saveZoneDataRepository; + + public SaveZoneDataServiceImpl(ConnectionSource connectionSource) throws SQLException { + this.saveZoneDataRepository = new SaveZoneDataRepository(connectionSource); + } + + @Override + public void saveProtectZone(String name, String location) { + try { + SafeZoneDataBase safeZoneDataBase = new SafeZoneDataBase(name, location); + saveZoneDataRepository.saveStructureData(safeZoneDataBase); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public void removeProtectZone(int id) { + try { + saveZoneDataRepository.removeProtectZone(id); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public List getAllSaveZones() { + try { + return saveZoneDataRepository.getAllStructuresData(); + } catch (SQLException e) { + e.printStackTrace(); + return List.of(); + } + } + + @Override + public boolean isProtectZone(Location playerLocation) { + try { + List> saveZoneDataZones = saveZoneDataRepository.getSaveZoneDataZones(); + for (Pair zone : saveZoneDataZones) { + if (isLocationInZone(playerLocation, zone.getLeft(), zone.getRight())) { + return true; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public List> getSaveZones() { + try { + return saveZoneDataRepository.getSaveZoneDataZones(); + } catch (SQLException e) { + e.printStackTrace(); + return List.of(); + } + } + + private boolean isLocationInZone(Location location, Location loc1, Location loc2) { + int x1 = Math.min(loc1.getBlockX(), loc2.getBlockX()); + int y1 = Math.min(loc1.getBlockY(), loc2.getBlockY()); + int z1 = Math.min(loc1.getBlockZ(), loc2.getBlockZ()); + + int x2 = Math.max(loc1.getBlockX(), loc2.getBlockX()); + int y2 = Math.max(loc1.getBlockY(), loc2.getBlockY()); + int z2 = Math.max(loc1.getBlockZ(), loc2.getBlockZ()); + + int px = location.getBlockX(); + int py = location.getBlockY(); + int pz = location.getBlockZ(); + + return (px >= x1 && px <= x2) && + (py >= y1 && py <= y2) && + (pz >= z1 && pz <= z2); + } +} diff --git a/src/main/java/dev/lotus/studio/event/JoinLeaveEvent.java b/src/main/java/dev/lotus/studio/event/JoinLeaveEvent.java index e573ad1..09f193e 100644 --- a/src/main/java/dev/lotus/studio/event/JoinLeaveEvent.java +++ b/src/main/java/dev/lotus/studio/event/JoinLeaveEvent.java @@ -5,8 +5,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; -import dev.lotus.studio.database.hibernate.playerdata.PlayerDataBase; -import dev.lotus.studio.database.hibernate.playerdata.PlayerDataService; +import dev.lotus.studio.database.playerdata.PlayerDataBase; +import dev.lotus.studio.database.playerdata.PlayerDataService; import dev.lotus.studio.playerdata.PlayerData; import dev.lotus.studio.playerdata.PlayerManager; @@ -28,18 +28,28 @@ public void playerDeath(PlayerRespawnEvent e){ @EventHandler public void playerQuit(PlayerQuitEvent e){ PlayerData playerData = PlayerManager.getInstance().getPlayerData(e.getPlayer()); - playerDataService.savePlayer(e.getPlayer().getName(),playerData.getTemperatureValue(),playerData.getRadiationValue()); + if (playerDataService.getPlayer(e.getPlayer().getName()) == null){ + playerDataService.savePlayer(e.getPlayer().getName(),playerData.getTemperatureValue(),playerData.getRadiationValue()); + return; + } + playerDataService.updatePlayer(e.getPlayer().getName(),playerData.getTemperatureValue(),playerData.getRadiationValue()); } @EventHandler public void playerJoin(PlayerJoinEvent e){ PlayerDataBase playerDataBase = playerDataService.getPlayer(e.getPlayer().getName()); + if (playerDataBase != null){ + PlayerData playerData = PlayerManager.getInstance().getPlayerData(e.getPlayer()); + playerData.setTemperatureValue(playerDataBase.getFreezeValue()); + playerData.setRadiationValue(playerDataBase.getRadiationValue()); + System.out.println(" RAD : " + playerDataBase.getRadiationValue() + " WIN: " + playerDataBase.getFreezeValue() ); + System.out.println(" RAD : " + playerData.getRadiationValue() + " WIN: " + playerData.getTemperatureValue() ); + return; + } PlayerData playerData = PlayerManager.getInstance().getPlayerData(e.getPlayer()); - playerData.setTemperatureValue(playerDataBase.getFreezeValue()); - playerData.setRadiationValue(playerDataBase.getRadiationValue()); - System.out.println(" RAD : " + playerDataBase.getRadiationValue() + " WIN: " + playerDataBase.getFreezeValue() ); - System.out.println(" RAD : " + playerData.getRadiationValue() + " WIN: " + playerData.getTemperatureValue() ); + playerData.setRadiationValue(0); + playerData.setTemperatureValue(20); } } diff --git a/src/main/java/dev/lotus/studio/handlers/RadiationHandler.java b/src/main/java/dev/lotus/studio/handlers/RadiationHandler.java index 8d53d05..74b3e8f 100644 --- a/src/main/java/dev/lotus/studio/handlers/RadiationHandler.java +++ b/src/main/java/dev/lotus/studio/handlers/RadiationHandler.java @@ -10,17 +10,17 @@ public class RadiationHandler { - private double HEIGHT_LOW = -60; - private double HEIGHT_HIGH = 50; + private final double HEIGHT_LOW = -60; + private final double HEIGHT_HIGH = 50; - private double MIN_RADIATION_SPEED = 0; - private double MAX_RADIATION_SPEED = 2; + private final double MIN_RADIATION_SPEED = 0; + private final double MAX_RADIATION_SPEED = 2; - private double MIN_RADIATION_VALUE = 0; - private double MAX_PLAYER_RADIATION_VALUE = 20; - private double MAX_RADIATION_VALUE = 30; + private final double MIN_RADIATION_VALUE = 0; + private final double MAX_PLAYER_RADIATION_VALUE = 20; + private final double MAX_RADIATION_VALUE = 30; - private double MAX_DAMAGE_PER_SEC = 4; + private final double MAX_DAMAGE_PER_SEC = 4; private static final RadiationHandler instance = new RadiationHandler(); @@ -50,7 +50,7 @@ public double calculate(Player player, double value, double resistance){ new_value += radiationSpeed; - new_value = Math.clamp(new_value, MIN_RADIATION_VALUE, MAX_RADIATION_VALUE); + new_value = Math.floor(Math.clamp(new_value, MIN_RADIATION_VALUE, MAX_RADIATION_VALUE) * 100) / 100.0; return new_value; } diff --git a/src/main/java/dev/lotus/studio/handlers/TemperatureHandler.java b/src/main/java/dev/lotus/studio/handlers/TemperatureHandler.java index 216246f..c98cfa5 100644 --- a/src/main/java/dev/lotus/studio/handlers/TemperatureHandler.java +++ b/src/main/java/dev/lotus/studio/handlers/TemperatureHandler.java @@ -83,7 +83,7 @@ public double calculate(Player player, double value, double resistance){ } new_value = new_value + speed; - new_value = Math.clamp(new_value, MIN_TEMPERATURE, MAX_TEMPERATURE); + new_value = Math.floor(Math.clamp(new_value, MIN_TEMPERATURE, MAX_TEMPERATURE) * 100) / 100.0; return new_value; } diff --git a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java index 4fed9f7..137f43e 100644 --- a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java +++ b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java @@ -5,8 +5,8 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import dev.lotus.studio.Main; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneData; -import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService; +import dev.lotus.studio.database.savezone.SafeZoneDataBase; +import dev.lotus.studio.database.savezone.SaveZoneDataService; import java.util.ArrayList; import java.util.List; @@ -59,10 +59,10 @@ public boolean isPlayerInAnyZone(Player player) { } public void initializeZones(SaveZoneDataService saveZoneDataService) { - List zonesData = saveZoneDataService.getAllSaveZones(); + List zonesData = saveZoneDataService.getAllSaveZones(); try { - for (SaveZoneData data : zonesData) { + for (SafeZoneDataBase data : zonesData) { try { // Парсим данные координат List> parsedZones = parseZonesFromString(data.getLocationValue()); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3610f0a..7cb9b90 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,11 @@ -name: LotusOffSeasonV2 +name: FrostAndFallout version: '1.0-SNAPSHOT' main: dev.lotus.studio.Main api-version: '1.21' soft-depend: [Oraxen] +libraries: + - org.xerial:sqlite-jdbc:3.50.3.0 + - com.j256.ormlite:ormlite-jdbc:6.1 commands: lotus: description: Перезагрузка конфигурации плагина. From 8204c4df8dc1b5b29240f6016b90feb18c3e1000 Mon Sep 17 00:00:00 2001 From: Referix Date: Sun, 14 Sep 2025 18:07:13 +0300 Subject: [PATCH 2/4] remove ShadowJar build.gradle --- build.gradle | 7 ------- 1 file changed, 7 deletions(-) diff --git a/build.gradle b/build.gradle index e493c6e..4600616 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,6 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '8.1.1' } group = 'dev.lotus.studio' @@ -43,11 +41,6 @@ java { } } -shadowJar { - archiveClassifier.set('') - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - configurations = [project.configurations.runtimeClasspath] -} processResources { From 8f024555e6e112b91da44bc8ebf178f835490c2b Mon Sep 17 00:00:00 2001 From: Referix Date: Mon, 15 Sep 2025 15:30:02 +0300 Subject: [PATCH 3/4] Determine Version Fix --- .github/workflows/gradle-publish.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml index f37f955..1cef4a7 100644 --- a/.github/workflows/gradle-publish.yml +++ b/.github/workflows/gradle-publish.yml @@ -78,12 +78,14 @@ jobs: BRANCH_NAME=${GITHUB_REF##*/} echo "Branch: $BRANCH_NAME" - # Останній тег для release або pre-release if [ "$BRANCH_NAME" == "release" ]; then - LAST_TAG=$(git describe --tags --match "v[0-9]*\.[0-9]*\.[0-9]*" --abbrev=0 2>/dev/null || echo "") + # беремо тільки стабільні теги vX.Y.Z + LAST_TAG=$(git tag --list "v[0-9]*.[0-9]*.[0-9]*" --sort=-creatordate | tail -n1) else - LAST_TAG=$(git tag --list "v*-dev.*" --sort=-creatordate | head -n1 || echo "") + # беремо тільки dev/pre-release теги + LAST_TAG=$(git tag --list "v*-dev.*" --sort=-creatordate | tail -n1) fi + echo "Last tag: $LAST_TAG" # Розбираємо версію @@ -154,6 +156,7 @@ jobs: echo "New version: $NEW_VERSION" echo "new=$NEW_VERSION" >> $GITHUB_OUTPUT + - name: Grant execute permission for gradlew run: chmod +x gradlew From 68c31f3e9703697acdf3f813549d7e15571f95ea Mon Sep 17 00:00:00 2001 From: Referix Date: Mon, 15 Sep 2025 17:50:51 +0300 Subject: [PATCH 4/4] Refactoring code finish work --- src/main/java/dev/lotus/studio/Main.java | 20 +++---- .../studio/database/DatabaseInitializer.java | 52 ++++++++++++++++++- .../playerdata/PlayerDataRepository.java | 3 +- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index 8cdb3d6..14a127e 100644 --- a/src/main/java/dev/lotus/studio/Main.java +++ b/src/main/java/dev/lotus/studio/Main.java @@ -2,6 +2,7 @@ import com.j256.ormlite.support.ConnectionSource; import dev.lotus.studio.database.DatabaseInitializer; +import dev.lotus.studio.database.playerdata.PlayerDataService; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl; @@ -26,7 +27,7 @@ public final class Main extends JavaPlugin { - private PlayerDataServiceImpl playerDataBase; + private PlayerDataService playerDataBase; private SaveZoneDataService saveZoneDataService; private DatabaseInitializer databaseInitializer; @@ -40,13 +41,10 @@ public void onEnable() { //cfg itemManager = new CustomItemManager(); databaseInitializer = new DatabaseInitializer(this); - try { - ConnectionSource connectionSource = databaseInitializer.openConnection(); - this.playerDataBase = new PlayerDataServiceImpl(connectionSource); - this.saveZoneDataService = new SaveZoneDataServiceImpl(connectionSource); - } catch (SQLException e) { - throw new RuntimeException(e); - } + playerDataBase = databaseInitializer.getPlayerDataBase(); + saveZoneDataService = databaseInitializer.getSaveZoneDataService(); + + itemManager.loadItems(); getServer().getPluginManager().registerEvents(new ArmorEvent(itemManager),this); @@ -67,11 +65,13 @@ public void onEnable() { public void onDisable() { PlayerManager.getInstance().getGlobalTask().cancel(); // Закриття DataBase - databaseInitializer.closeConnection(); + if (databaseInitializer != null) { + databaseInitializer.closeConnection(); + } getLogger().info("LotusOffSeason plugin disabled!"); HandlerList.unregisterAll(this); } - public PlayerDataServiceImpl getPlayerDataBase() { + public PlayerDataService getPlayerDataBase() { return playerDataBase; } diff --git a/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java b/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java index 1eea5b5..243967e 100644 --- a/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java +++ b/src/main/java/dev/lotus/studio/database/DatabaseInitializer.java @@ -4,7 +4,11 @@ import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import dev.lotus.studio.database.playerdata.PlayerDataBase; +import dev.lotus.studio.database.playerdata.PlayerDataService; +import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl; import dev.lotus.studio.database.savezone.SafeZoneDataBase; +import dev.lotus.studio.database.savezone.SaveZoneDataService; +import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -19,6 +23,10 @@ public class DatabaseInitializer { private final String databasePath; private ConnectionSource connectionSource; + private PlayerDataService playerDataBase; + + private SaveZoneDataService saveZoneDataService; + public DatabaseInitializer(JavaPlugin plugin) { this.plugin = plugin; this.logger = plugin.getLogger(); @@ -26,6 +34,7 @@ public DatabaseInitializer(JavaPlugin plugin) { try { createDatabaseFile(); createTables(); + initialDataService(); } catch (IOException | SQLException e) { throw new RuntimeException(e); } @@ -36,16 +45,42 @@ public DatabaseInitializer(JavaPlugin plugin) { */ public void createDatabaseFile() throws IOException { File dataFolder = plugin.getDataFolder(); - if (!dataFolder.exists()) dataFolder.mkdirs(); + if (!dataFolder.exists()) { + if (!dataFolder.mkdirs()) { + logger.warning("Не вдалося створити директорію плагіна: " + dataFolder.getAbsolutePath()); + } + } File databaseFile = new File(databasePath); if (!databaseFile.exists()) { if (databaseFile.createNewFile()) { logger.info("Створено новий файл бази даних: " + databasePath); + } else { + logger.warning("Не вдалося створити файл бази даних: " + databasePath); } } } + + /** + * Инициализация сервисов бд + */ + + public void initialDataService() { + try { + ConnectionSource connectionSource = openConnection(); + this.playerDataBase = new PlayerDataServiceImpl(connectionSource); + this.saveZoneDataService = new SaveZoneDataServiceImpl(connectionSource); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + + + + + /** * Повертає ORMLite ConnectionSource */ @@ -84,4 +119,19 @@ public void closeConnection() { } } } + + /** + * This method + * @return PlayerDataService + */ + public PlayerDataService getPlayerDataBase() { + return playerDataBase; + } + /** + * This method + * @return SaveZoneDataService + */ + public SaveZoneDataService getSaveZoneDataService() { + return saveZoneDataService; + } } diff --git a/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java index a554fad..d32b6d9 100644 --- a/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java +++ b/src/main/java/dev/lotus/studio/database/playerdata/PlayerDataRepository.java @@ -2,6 +2,7 @@ import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; import java.sql.SQLException; @@ -9,7 +10,7 @@ public class PlayerDataRepository { private final Dao playerDao; - public PlayerDataRepository(com.j256.ormlite.support.ConnectionSource connectionSource) throws SQLException { + public PlayerDataRepository(ConnectionSource connectionSource) throws SQLException { this.playerDao = DaoManager.createDao(connectionSource, PlayerDataBase.class); }