Skip to content
Snippets Groups Projects
Commit 26e1341c authored by Benjamin Elsdon's avatar Benjamin Elsdon
Browse files

Out of my madness and suffering I have achieved the impossible. I almost lost...

Out of my madness and suffering I have achieved the impossible. I almost lost all hope and was about to end it all. However, it worked out in the end and now we have gacha reloading.
parent 28a070f1
Branches
Tags
No related merge requests found
...@@ -10,6 +10,7 @@ import java.util.concurrent.ThreadLocalRandom; ...@@ -10,6 +10,7 @@ import java.util.concurrent.ThreadLocalRandom;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.sun.nio.file.SensitivityWatchEventModifier;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GenshinData; import emu.grasscutter.data.GenshinData;
import emu.grasscutter.data.def.ItemData; import emu.grasscutter.data.def.ItemData;
...@@ -31,14 +32,11 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; ...@@ -31,14 +32,11 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntList;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
public class GachaManager { public class GachaManager {
private final GameServer server; private final GameServer server;
private final Int2ObjectMap<GachaBanner> gachaBanners; private final Int2ObjectMap<GachaBanner> gachaBanners;
private GetGachaInfoRsp cachedProto; private GetGachaInfoRsp cachedProto;
WatchService watchService; WatchService watchService;
WatchKey watchKey;
private int[] yellowAvatars = new int[] {1003, 1016, 1042, 1035, 1041}; private int[] yellowAvatars = new int[] {1003, 1016, 1042, 1035, 1041};
private int[] yellowWeapons = new int[] {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; private int[] yellowWeapons = new int[] {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502};
...@@ -74,10 +72,17 @@ public class GachaManager { ...@@ -74,10 +72,17 @@ public class GachaManager {
public synchronized void load() { public synchronized void load() {
try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "Banners.json")) { try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "Banners.json")) {
getGachaBanners().clear();
List<GachaBanner> banners = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, GachaBanner.class).getType()); List<GachaBanner> banners = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, GachaBanner.class).getType());
if(banners.size() > 0) {
for (GachaBanner banner : banners) { for (GachaBanner banner : banners) {
getGachaBanners().put(banner.getGachaType(), banner); getGachaBanners().put(banner.getGachaType(), banner);
} }
Grasscutter.getLogger().info("Banners successfully loaded.");
this.cachedProto = createProto();
} else {
Grasscutter.getLogger().error("Unable to load banners. Banners size is 0.");
}
} catch (Exception e) { } catch (Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
...@@ -281,8 +286,7 @@ public class GachaManager { ...@@ -281,8 +286,7 @@ public class GachaManager {
try { try {
this.watchService = FileSystems.getDefault().newWatchService(); this.watchService = FileSystems.getDefault().newWatchService();
Path path = new File(Grasscutter.getConfig().DATA_FOLDER).toPath(); Path path = new File(Grasscutter.getConfig().DATA_FOLDER).toPath();
path.register(watchService, ENTRY_MODIFY); path.register(watchService, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH);
watchKey = watchService.take();
server.OnGameServerTick.register(this); server.OnGameServerTick.register(this);
} catch (Exception e) { } catch (Exception e) {
...@@ -298,6 +302,8 @@ public class GachaManager { ...@@ -298,6 +302,8 @@ public class GachaManager {
public synchronized void watchBannerJson(GameServerTickEvent tickEvent) { public synchronized void watchBannerJson(GameServerTickEvent tickEvent) {
if(Grasscutter.getConfig().getServerOptions().WatchGacha) { if(Grasscutter.getConfig().getServerOptions().WatchGacha) {
try { try {
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) { for (WatchEvent<?> event : watchKey.pollEvents()) {
final Path changed = (Path) event.context(); final Path changed = (Path) event.context();
if (changed.endsWith("Banners.json")) { if (changed.endsWith("Banners.json")) {
...@@ -305,6 +311,12 @@ public class GachaManager { ...@@ -305,6 +311,12 @@ public class GachaManager {
this.load(); this.load();
} }
} }
boolean valid = watchKey.reset();
if (!valid) {
Grasscutter.getLogger().error("Unable to reset Gacha Manager Watch Key. Auto-reload of banners.json will no longer work.");
return;
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment