Skip to content

Commit 40843fd

Browse files
authored
feat: add SafeZonePreloader with lazy DB loading and caching
2 parents ee01e45 + 7682ccd commit 40843fd

16 files changed

+487
-373
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies {
3131
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
3232
compileOnly 'io.th0rgal:oraxen:1.184.1'
3333
compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.15")
34+
implementation("com.google.guava:guava:10.0.1")
3435
implementation("org.xerial:sqlite-jdbc:3.50.3.0")
3536
implementation("com.j256.ormlite:ormlite-jdbc:6.1")
3637
}

src/main/java/dev/lotus/studio/Main.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package dev.lotus.studio;
22

3-
import com.j256.ormlite.support.ConnectionSource;
43
import dev.lotus.studio.database.DatabaseInitializer;
54
import dev.lotus.studio.database.playerdata.PlayerDataService;
65
import org.bukkit.event.HandlerList;
76
import org.bukkit.plugin.java.JavaPlugin;
8-
import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl;
9-
import dev.lotus.studio.database.savezone.SaveZoneDataService;
10-
import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl;
7+
import dev.lotus.studio.database.savezone.SafeZoneDataService;
118
import dev.lotus.studio.event.EatEvent;
129
import dev.lotus.studio.event.JoinLeaveEvent;
1310
import dev.lotus.studio.item.CustomItemManager;
@@ -17,22 +14,15 @@
1714
import dev.lotus.studio.playerdata.PlayerManager;
1815
import dev.lotus.studio.safezone.SafeZoneManager;
1916

20-
import java.sql.SQLException;
21-
2217
public final class Main extends JavaPlugin {
2318

2419
private static Main instance;
2520
private CustomItemManager itemManager;
2621

27-
28-
29-
3022
private PlayerDataService playerDataBase;
31-
private SaveZoneDataService saveZoneDataService;
23+
private SafeZoneDataService safeZoneDataService;
3224
private DatabaseInitializer databaseInitializer;
3325

34-
35-
3626
@Override
3727
public void onEnable() {
3828

@@ -42,7 +32,7 @@ public void onEnable() {
4232
itemManager = new CustomItemManager();
4333
databaseInitializer = new DatabaseInitializer(this);
4434
playerDataBase = databaseInitializer.getPlayerDataBase();
45-
saveZoneDataService = databaseInitializer.getSaveZoneDataService();
35+
safeZoneDataService = databaseInitializer.getSaveZoneDataService();
4636

4737

4838

@@ -55,15 +45,16 @@ public void onEnable() {
5545
new PlayerBar(this,itemManager);
5646

5747

58-
new MainCommand("lotus", itemManager,saveZoneDataService);
48+
new MainCommand("lotus", itemManager);
5949

60-
SafeZoneManager.getInstance().initializeZones(saveZoneDataService);
50+
SafeZoneManager.getInstance().initialize(safeZoneDataService);
6151

6252
}
6353

6454
@Override
6555
public void onDisable() {
6656
PlayerManager.getInstance().getGlobalTask().cancel();
57+
SafeZoneManager.getInstance().getPreloaded().stopTask();
6758
// Закриття DataBase
6859
if (databaseInitializer != null) {
6960
databaseInitializer.closeConnection();

src/main/java/dev/lotus/studio/command/MainCommand.java

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.bukkit.command.CommandSender;
55
import org.bukkit.entity.Player;
66
import org.bukkit.inventory.ItemStack;
7-
import dev.lotus.studio.database.savezone.SaveZoneDataService;
7+
import dev.lotus.studio.database.savezone.SafeZoneDataService;
88
import dev.lotus.studio.item.CustomItemManager;
99

1010
import java.util.ArrayList;
@@ -14,10 +14,10 @@ public class MainCommand extends AbstractCommand {
1414
private final CustomItemManager itemManager;
1515
private final SafeZoneCommand saveZoneCommand;
1616

17-
public MainCommand(String command, CustomItemManager itemManager, SaveZoneDataService saveZoneDataService) {
17+
public MainCommand(String command, CustomItemManager itemManager) {
1818
super(command);
1919
this.itemManager = itemManager;
20-
this.saveZoneCommand =new SafeZoneCommand(saveZoneDataService);
20+
this.saveZoneCommand =new SafeZoneCommand();
2121
}
2222

2323
@Override
@@ -286,20 +286,6 @@ private void sendEatHelp(Player player, String label) {
286286
}
287287

288288

289-
290-
291-
292-
293-
294-
295-
296-
297-
298-
299-
300-
301-
302-
303289
@Override
304290
public List<String> complete(CommandSender sender, String[] args) {
305291
List<String> suggestions = new ArrayList<>();
@@ -313,7 +299,7 @@ public List<String> complete(CommandSender sender, String[] args) {
313299
suggestions.addAll(List.of("armor", "view", "eat", "help"));
314300
}
315301
else if ("savezone".equals(category)) {
316-
suggestions.addAll(List.of("pos1", "pos2", "save","list"));
302+
suggestions.addAll(List.of("pos1", "pos2", "save","list","remove"));
317303
}
318304
} else if (args.length == 3) {
319305
String category = args[0].toLowerCase();
Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
package dev.lotus.studio.command;
22

3-
3+
import dev.lotus.studio.database.savezone.SafeZoneDataBase;
4+
import dev.lotus.studio.database.savezone.SafeZoneDataService;
5+
import dev.lotus.studio.safezone.SafeZone;
6+
import dev.lotus.studio.safezone.SafeZoneManager;
7+
import net.kyori.adventure.text.Component;
8+
import org.apache.commons.lang3.tuple.ImmutablePair;
9+
import org.apache.commons.lang3.tuple.Pair;
410
import org.bukkit.Location;
511
import org.bukkit.command.CommandSender;
612
import org.bukkit.entity.Player;
7-
import dev.lotus.studio.database.savezone.SafeZoneDataBase;
8-
import dev.lotus.studio.database.savezone.SaveZoneDataService;
913

1014
import java.util.HashMap;
1115
import java.util.List;
1216

17+
import static dev.lotus.studio.utils.MapperUtils.formatLocation;
18+
1319
public class SafeZoneCommand {
14-
private final SaveZoneDataService service;
20+
private final SafeZoneManager safeZoneManager = SafeZoneManager.getInstance();
1521

1622
private Location pos1 = null;
1723
private Location pos2 = null;
1824

19-
public SafeZoneCommand(SaveZoneDataService service) {
20-
this.service = service;
21-
}
2225

2326
public boolean execute(CommandSender sender, String label, String[] args) {
2427
if (!(sender instanceof Player player)) {
@@ -37,83 +40,75 @@ public boolean execute(CommandSender sender, String label, String[] args) {
3740
switch (args[1].toLowerCase()) {
3841
case "pos1":
3942
pos1 = player.getLocation();
40-
player.sendMessage("fist point: " + formatLocation(pos1));
43+
player.sendMessage("first point: " + formatLocation(pos1));
4144
break;
4245

4346
case "pos2":
4447
pos2 = player.getLocation();
45-
player.sendMessage("second points: " + formatLocation(pos2));
48+
player.sendMessage("second point: " + formatLocation(pos2));
4649
break;
4750

4851
case "save":
4952
if (args.length < 3) {
5053
player.sendMessage("set name to savezone: /lotus savezone save <назва>");
5154
return true;
5255
}
53-
saveZoneToDB(player, pos1, pos2, args[2]);
56+
saveZone(player, pos1, pos2, args[2]);
5457
break;
58+
5559
case "list":
56-
player.sendMessage("Укажіть назву для зони. Наприклад: /<команда> save <назва>");
57-
listZoneToDB(player);
60+
listZones(player);
5861
return true;
62+
5963
case "remove":
6064
if (args.length < 3) {
61-
player.sendMessage("Укажіть назву для зони. Наприклад: /<команда> save <назва>");
65+
player.sendMessage("Укажіть ID зони: /lotus savezone remove <id>");
6266
return true;
6367
}
64-
removeZoneToDB(player, Integer.parseInt(args[1]));
68+
removeZone(player, Integer.parseInt(args[2]));
6569
break;
70+
6671
default:
67-
player.sendMessage("Невідома команда. Використовуйте: pos1, pos2 або save.");
72+
player.sendMessage("Невідома команда. Використовуйте: pos1, pos2, save, list, remove.");
6873
}
6974
return true;
7075
}
7176

72-
private void removeZoneToDB(Player player, int id) {
73-
service.getAllSaveZones().forEach(safeZoneDataBase -> {
74-
if (safeZoneDataBase.getSafeZoneId() == id){
75-
player.sendMessage("Сейв зону удаленно с названием: " + safeZoneDataBase.getSafeZoneName() + " ID: " + safeZoneDataBase.getSafeZoneId());
76-
}
77-
});
78-
service.removeProtectZone(id);
77+
private void saveZone(Player player, Location pos1, Location pos2, String zoneName) {
78+
if (pos1 != null && pos2 != null) {
79+
Pair<Location, Location> zoneLoc = new ImmutablePair<>(pos1, pos2);
80+
SafeZone safeZone = new SafeZone(zoneName, zoneLoc);
81+
82+
// runtime
83+
safeZoneManager.addSafeZone(safeZone);
84+
85+
player.sendMessage("Зона '" + zoneName + "' успішно збережена.");
86+
} else {
87+
player.sendMessage("Будь ласка, спочатку встановіть обидві точки (pos1 і pos2).");
88+
}
7989
}
8090

81-
private void listZoneToDB(Player player) {
82-
// Отримуємо всі збережені зони з бази даних
83-
List<SafeZoneDataBase> safeZoneDataBases = service.getAllSaveZones();
91+
private void listZones(Player player) {
92+
List<SafeZoneDataBase> safeZones = safeZoneManager.getDataZones();
8493

85-
// Якщо зон немає, повідомляємо гравця
86-
if (safeZoneDataBases.isEmpty()) {
87-
player.sendMessage("нет зон.");
94+
if (safeZones.isEmpty()) {
95+
player.sendMessage("немає зон.");
8896
return;
8997
}
9098

91-
// Формуємо мапу з імен зон і їх ідентифікаторів
9299
HashMap<String, Integer> saveId = new HashMap<>();
93-
safeZoneDataBases.forEach(saveZoneData -> saveId.put(saveZoneData.getSafeZoneName(), saveZoneData.getSafeZoneId()));
100+
safeZones.forEach(zone -> saveId.put(zone.getSafeZoneName(), zone.getSafeZoneId()));
94101

95-
// Виводимо гравцю список зон
96102
player.sendMessage("Список зон:");
97103
saveId.forEach((name, id) ->
98-
player.sendMessage(" - Имя: " + name + ", ID: " + id)
104+
player.sendMessage(" - Назва: " + name + ", ID: " + id)
99105
);
100106
}
101107

108+
private void removeZone(Player player, int id) {
109+
// runtime
110+
safeZoneManager.removeSafeZone(id);
102111

103-
private void saveZoneToDB(Player player, Location pos1, Location pos2, String zoneName) {
104-
if (pos1 != null && pos2 != null) {
105-
String positionData = formatLocation(pos1) + "|" + formatLocation(pos2);
106-
service.saveProtectZone(zoneName, positionData);
107-
player.sendMessage("Зона '" + zoneName + "' успішно збережена.");
108-
} else {
109-
player.sendMessage("Будь ласка, спочатку встановіть обидві точки (pos1 і pos2).");
110-
}
112+
player.sendMessage(Component.text("Safe zone with ID " + id + " deleted!"));
111113
}
112-
113-
private String formatLocation(Location location) {
114-
return location.getBlockX() + "," +
115-
location.getBlockY() + "," +
116-
location.getBlockZ();
117-
}
118-
119114
}

src/main/java/dev/lotus/studio/database/DatabaseInitializer.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import dev.lotus.studio.database.playerdata.PlayerDataService;
88
import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl;
99
import dev.lotus.studio.database.savezone.SafeZoneDataBase;
10-
import dev.lotus.studio.database.savezone.SaveZoneDataService;
11-
import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl;
10+
import dev.lotus.studio.database.savezone.SafeZoneDataService;
11+
import dev.lotus.studio.database.savezone.SafeZoneDataServiceImpl;
1212
import org.bukkit.plugin.java.JavaPlugin;
1313

1414
import java.io.File;
@@ -25,7 +25,7 @@ public class DatabaseInitializer {
2525

2626
private PlayerDataService playerDataBase;
2727

28-
private SaveZoneDataService saveZoneDataService;
28+
private SafeZoneDataService safeZoneDataService;
2929

3030
public DatabaseInitializer(JavaPlugin plugin) {
3131
this.plugin = plugin;
@@ -70,17 +70,12 @@ public void initialDataService() {
7070
try {
7171
ConnectionSource connectionSource = openConnection();
7272
this.playerDataBase = new PlayerDataServiceImpl(connectionSource);
73-
this.saveZoneDataService = new SaveZoneDataServiceImpl(connectionSource);
73+
this.safeZoneDataService = new SafeZoneDataServiceImpl(connectionSource);
7474
} catch (SQLException e) {
7575
throw new RuntimeException(e);
7676
}
7777
}
7878

79-
80-
81-
82-
83-
8479
/**
8580
* Повертає ORMLite ConnectionSource
8681
*/
@@ -127,11 +122,12 @@ public void closeConnection() {
127122
public PlayerDataService getPlayerDataBase() {
128123
return playerDataBase;
129124
}
125+
130126
/**
131127
* This method
132128
* @return SaveZoneDataService
133129
*/
134-
public SaveZoneDataService getSaveZoneDataService() {
135-
return saveZoneDataService;
130+
public SafeZoneDataService getSaveZoneDataService() {
131+
return safeZoneDataService;
136132
}
137133
}

0 commit comments

Comments
 (0)