mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-15 06:45:04 +01:00
Auto reload gacha banners on change
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package emu.lunarcore.game.gacha;
|
package emu.lunarcore.game.gacha;
|
||||||
|
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
|
import java.nio.file.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -33,7 +34,8 @@ import lombok.Getter;
|
|||||||
@Getter
|
@Getter
|
||||||
public class GachaService extends BaseGameService {
|
public class GachaService extends BaseGameService {
|
||||||
private final Int2ObjectMap<GachaBanner> gachaBanners;
|
private final Int2ObjectMap<GachaBanner> gachaBanners;
|
||||||
private GetGachaInfoScRsp cachedProto;
|
private WatchService watchService;
|
||||||
|
private Thread watchThread;
|
||||||
|
|
||||||
private int[] yellowAvatars = new int[] {1003, 1004, 1101, 1107, 1104, 1209, 1211};
|
private int[] yellowAvatars = new int[] {1003, 1004, 1101, 1107, 1104, 1209, 1211};
|
||||||
private int[] yellowWeapons = new int[] {23000, 23002, 23003, 23004, 23005, 23012, 23013};
|
private int[] yellowWeapons = new int[] {23000, 23002, 23003, 23004, 23005, 23012, 23013};
|
||||||
@@ -48,7 +50,12 @@ public class GachaService extends BaseGameService {
|
|||||||
public GachaService(GameServer server) {
|
public GachaService(GameServer server) {
|
||||||
super(server);
|
super(server);
|
||||||
this.gachaBanners = new Int2ObjectOpenHashMap<>();
|
this.gachaBanners = new Int2ObjectOpenHashMap<>();
|
||||||
this.load();
|
|
||||||
|
try {
|
||||||
|
this.watch();
|
||||||
|
} catch (Exception e) {
|
||||||
|
LunarCore.getLogger().error("Watch service error: ", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int randomRange(int min, int max) {
|
public int randomRange(int min, int max) {
|
||||||
@@ -58,9 +65,48 @@ public class GachaService extends BaseGameService {
|
|||||||
public int getRandom(int[] array) {
|
public int getRandom(int[] array) {
|
||||||
return array[randomRange(0, array.length - 1)];
|
return array[randomRange(0, array.length - 1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getBannerFileName() {
|
||||||
|
return LunarCore.getConfig().getDataDir() + "/Banners.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void watch() throws Exception {
|
||||||
|
// Load banners first
|
||||||
|
this.loadBanners();
|
||||||
|
|
||||||
|
// Create watch service
|
||||||
|
this.watchService = FileSystems.getDefault().newWatchService();
|
||||||
|
Path watchPath = Paths.get(LunarCore.getConfig().getDataDir());
|
||||||
|
watchPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
|
||||||
|
|
||||||
public synchronized void load() {
|
// Start watch thread
|
||||||
try (FileReader fileReader = new FileReader(LunarCore.getConfig().getDataDir() + "/Banners.json")) {
|
this.watchThread = new Thread(() -> {
|
||||||
|
WatchKey key = null;
|
||||||
|
try {
|
||||||
|
while ((key = watchService.take()) != null) {
|
||||||
|
for (var event : key.pollEvents()) {
|
||||||
|
if (event.context() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.context() instanceof Path path && path.toString().equals("Banners.json")) {
|
||||||
|
loadBanners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
key.reset();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LunarCore.getLogger().error("Watch service thread error: ", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.watchThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void loadBanners() {
|
||||||
|
this.getGachaBanners().clear();
|
||||||
|
|
||||||
|
try (FileReader fileReader = new FileReader(getBannerFileName())) {
|
||||||
List<GachaBanner> banners = JsonUtils.loadToList(fileReader, GachaBanner.class);
|
List<GachaBanner> banners = JsonUtils.loadToList(fileReader, GachaBanner.class);
|
||||||
for (GachaBanner banner : banners) {
|
for (GachaBanner banner : banners) {
|
||||||
getGachaBanners().put(banner.getId(), banner);
|
getGachaBanners().put(banner.getId(), banner);
|
||||||
|
|||||||
Reference in New Issue
Block a user