package emu.grasscutter.game.tower; import emu.grasscutter.Grasscutter; import emu.grasscutter.data.DataLoader; import emu.grasscutter.data.GameData; import emu.grasscutter.data.excels.TowerScheduleData; import emu.grasscutter.server.game.BaseGameSystem; import emu.grasscutter.server.game.GameServer; import java.util.ArrayList; import java.util.List; public class TowerSystem extends BaseGameSystem { public TowerSystem(GameServer server) { super(server); this.load(); } private TowerScheduleConfig towerScheduleConfig; public synchronized void load() { try { towerScheduleConfig = DataLoader.loadClass("TowerSchedule.json", TowerScheduleConfig.class); } catch (Exception e) { Grasscutter.getLogger().error("Unable to load tower schedule config.", e); } } public TowerScheduleConfig getTowerScheduleConfig() { return towerScheduleConfig; } public TowerScheduleData getCurrentTowerScheduleData() { var data = GameData.getTowerScheduleDataMap().get(towerScheduleConfig.getScheduleId()); if (data == null) { Grasscutter.getLogger().error("Could not get current tower schedule data by schedule id {}, please check your resource files", towerScheduleConfig.getScheduleId()); } return data; } public List<Integer> getAllFloors() { List<Integer> floors = new ArrayList<>(this.getCurrentTowerScheduleData().getEntranceFloorId()); floors.addAll(this.getScheduleFloors()); return floors; } public List<Integer> getScheduleFloors() { return getCurrentTowerScheduleData().getSchedules().get(0).getFloorList(); } public int getNextFloorId(int floorId) { var entranceFloors = getCurrentTowerScheduleData().getEntranceFloorId(); var scheduleFloors = getScheduleFloors(); var nextId = 0; // find in entrance floors first for (int i=0;i<entranceFloors.size()-1;i++) { if (floorId == entranceFloors.get(i)) { nextId = entranceFloors.get(i+1); } } if (floorId == entranceFloors.get(entranceFloors.size()-1)) { nextId = scheduleFloors.get(0); } if (nextId != 0) { return nextId; } // find in schedule floors for (int i=0; i < scheduleFloors.size() - 1; i++) { if (floorId == scheduleFloors.get(i)) { nextId = scheduleFloors.get(i + 1); } }return nextId; } public Integer getLastEntranceFloor() { return getCurrentTowerScheduleData().getEntranceFloorId().get(getCurrentTowerScheduleData().getEntranceFloorId().size() - 1); } }